我需要在C Linux中找到当前进程的打开文件。到目前为止,我所能想到的只有当前 - > task_struct ...然后没有资源记录......最终我应该到open_fds
?此外,端点是位图文件吗?你如何从位图结构或其他一些奇怪的结构中获取打开的文件?
答案 0 :(得分:3)
在命令行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]='\0';
printf("%s -> %s\n", dir->d_name,hardfile);
} else
printf("error when executing readlink() on %s\n",tempath);
}
}
closedir(d);
}
return 0;
}
此代码来自:http://mydebian.blogdns.org/?p=229,其缓存在此处:http://tinyurl.com/6qlv2nj
请参阅:
How to use lsof(List Opened Files) in a C/C++ application?
http://www.linuxquestions.org/questions/linux-security-4/c-library-for-lsof-183332/
您也可以通过lsof
电话使用popen
命令。
答案 1 :(得分:3)
默认情况下,内核允许每个进程打开NR_OPEN_DEFAULT文件。该值已定义 在include / linux / sched.h中,默认设置为BITS_PER_LONG。在32位系统上,初始文件数为32; 64位系统可以同时处理64个文件。
在file.h中
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-&gt; files-&gt; fd_array)。此数组包含上述文件结构的实例,其中包含每个打开文件的所有必需文件信息。
通过循环遍历fd_array,您可以获取该进程所有打开文件的信息。