打印当前进程的打开文件

时间:2011-11-13 22:34:41

标签: c linux process linux-kernel file-descriptor

我需要在C Linux中找到当前进程的打开文件。到目前为止,我所能想到的只有当前 - > task_struct ...然后没有资源记录......最终我应该到open_fds?此外,端点是位图文件吗?你如何从位图结构或其他一些奇怪的结构中获取打开的文件?

2 个答案:

答案 0 :(得分:3)

在命令行lsof

上 C中的

,类似这样:

以下是程序的注释代码,它在屏幕上打印自己的打开文件列表:

#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,您可以获取该进程所有打开文件的信息。