我需要在C Linux中找到当前进程的打开文件。到目前为止,我所能弄清楚的是当前-> task_struct…这样就没有资源记录了……最终我应该得到open_fds
?另外,端点是位图文件吗?如何从位图结构或其他奇怪的结构中获取打开的文件?
默认情况下,内核允许每个进程打开NR_OPEN_DEFAULT
文件。这个值是定义的在include/linux/schedule .h中默认设置为"BITS_PER_LONG
"。因此,在32位系统上,初始文件数为32;64位系统可以同时处理64个文件。
struct files_struct {
42 /*
43 * read mostly part
44 */
45 atomic_t count;
46 struct fdtable *fdt;
47 struct fdtable fdtab;
48 /*
49 * written part on a separate cache line in SMP
50 */
51 spinlock_t file_lock ____cacheline_aligned_in_smp;
52 int next_fd;
53 struct embedded_fd_set close_on_exec_init;
54 struct embedded_fd_set open_fds_init;
55 struct file * fd_array[NR_OPEN_DEFAULT];
56};
在内核中,每个打开的文件都由一个文件描述符表示,该文件描述符作为文件的位置索引进程特定的数组(task_struct->files->fd_array)。该数组包含上述文件结构的一个实例,其中包含每个打开文件所需的所有文件信息。
通过循环fd_array
,您可以通过该进程获得所有打开文件的信息。
在命令行lsof
,像这样:
下面是一个程序的注释代码,该程序在屏幕上打印自己打开的文件列表:#include <unistd.h>
#include <stdio.h>
#include <dirent.h>
int main() {
// the directory we are going to open
DIR *d;
// max length of strings
int maxpathlength=256;
// the buffer for the full path
char path[maxpathlength];
// /proc/PID/fs contains the list of the open file descriptors among the respective filenames
sprintf(path,"/proc/%i/fd/",getpid() );
printf("List of %s:n",path);
struct dirent *dir;
d = opendir(path);
if (d) {
//loop for each file inside d
while1 != NULL) {
//let's check if it is a symbolic link
if (dir->d_type == DT_LNK) {
const int maxlength = 256;
# string returned by readlink()
char hardfile[maxlength];
#string length returned by readlink()
int len;
# tempath will contain the current filename among the fullpath
char tempath[maxlength];
sprintf(tempath,"%s%s",path,dir->d_name);
if2!=-1) {
hardfile[len]=' ';
printf("%s -> %sn", dir->d_name,hardfile);
} else
printf("error when executing readlink() on %sn",tempath);
}
}
closedir(d);
}
return 0;
}
这段代码来自:http://mydebian.blogdns.org/?p=229,缓存在这里:http://tinyurl.com/6qlv2nj
:
如何在C/c++应用程序中使用lsof(列表打开的文件)?http://www.linuxquestions.org/questions/linux-security-4/c-library-for-lsof-183332/您也可以通过popen
调用使用lsof
命令。