打印当前进程打开的文件



我需要在C Linux中找到当前进程的打开文件。到目前为止,我所能弄清楚的是当前-> task_struct…这样就没有资源记录了……最终我应该得到open_fds ?另外,端点是位图文件吗?如何从位图结构或其他奇怪的结构中获取打开的文件?

默认情况下,内核允许每个进程打开NR_OPEN_DEFAULT文件。这个值是定义的在include/linux/schedule .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->files->fd_array)。该数组包含上述文件结构的一个实例,其中包含每个打开文件所需的所有文件信息。

通过循环fd_array,您可以通过该进程获得所有打开文件的信息。

在命令行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]='';
                        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命令。

相关内容

  • 没有找到相关文章

最新更新