Найти текущий номер открытого дескриптора файла (НЕ lsof) - PullRequest
6 голосов
/ 17 ноября 2011

В * системах NIX, есть ли способ узнать, сколько открытых файловых дескрипторов имеется в текущем запущенном процессе?

Я ищу API или формулу для использования в C изнутризапущенный процесс.

Ответы [ 4 ]

6 голосов
/ 17 ноября 2011

Идея, которая должна работать в любой * nix-системе, приходит на ум:

int j, n = 0;

// count open file descriptors
for (j = 0;  j < FDMAX;  ++j)     // FDMAX should be retrieved from process limits,
                                  // but a constant value of >=4K should be
                                  // adequate for most systems
{
    int fd = dup (j);
    if (fd < 0)
        continue;
    ++n;
    close (fd);
}
printf ("%d file descriptors open\n", n);
6 голосов
/ 17 ноября 2011

В некоторых системах (см. Ниже) вы можете считать их в / proc / [pid] / fd. Если нет на одном из них, см. Ниже: ответ Wallyk .

В c вы можете перечислить dir и подсчитать общее количество, или перечислить содержимое dir:

 #include <stdio.h>
 #include <sys/types.h>
 #include <dirent.h>

 int
 main (void)
 {
   DIR *dp;
   struct dirent *ep;

   dp = opendir ("/proc/MYPID/fd/");
   if (dp != NULL)
     {
       while (ep = readdir (dp))
         puts (ep->d_name);
       (void) closedir (dp);
     }
   else
     perror ("Couldn't open the directory");

   return 0;
 }

В bash, что-то вроде:

ls -l /proc/[pid]/fd/ | wc -l

Операционные системы, которые поддерживают файловую систему proc, включают, но не ограничивается:
Solaris
IRIX
Tru64 UNIX
BSD
Linux (который распространяется на данные, не связанные с процессом)
IBM AIX (основанная на Linux для улучшения совместимости)
QNX
План 9 от Bell Labs

1 голос
/ 17 ноября 2011

OpenSSH реализует функцию closefrom, которая делает нечто очень похожее на то, что вам нужно, смешивая два подхода, уже предложенных wallyk и chown, и OpenSSH очень переносим, ​​по крайней мере, между Unix / Linux / BSD/ Cygwin systems.

0 голосов
/ 17 ноября 2011

Нет переносного способа получения количества открытых дескрипторов (независимо от типа), если только вы сами не отслеживаете их.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...