печать открытых файлов текущего процесса - PullRequest
2 голосов
/ 14 ноября 2011

Мне нужно найти открытые файлы текущего процесса в C Linux.До сих пор все, что я мог выяснить, было текущим -> task_struct ... тогда нет журнала ресурсов ... в конце концов я должен добраться до open_fds?Кроме того, является ли конечная точка файлом растрового изображения?Как бы вы получили открытые файлы из растровой структуры или какой-то другой странной структуры?

Ответы [ 2 ]

3 голосов
/ 14 ноября 2011

По умолчанию ядро ​​позволяет каждому процессу открывать файлы NR_OPEN_DEFAULT. Это значение определено в include / linux / sched.h с настройкой по умолчанию BITS_PER_LONG. Поэтому в 32-разрядных системах начальное количество файлов составляет 32; 64-разрядные системы могут одновременно обрабатывать 64 файла.

в файле .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, вы можете получить информацию обо всех открытых файлах процессом.

3 голосов
/ 14 ноября 2011

в командной строке 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

См .:

Как использовать lsof (Список открытых файлов) в приложении C / C ++?

http://www.linuxquestions.org/questions/linux-security-4/c-library-for-lsof-183332/

Вы также можете использовать команду lsof с помощью вызова popen.

...