6

在 *NIX 系统上,有没有办法找出当前运行的进程中有多少打开的文件句柄?

我正在从有问题的正在运行的进程中寻找用于 C 语言的 API 或公式。

4

4 回答 4

6

在某些系统上(见下文),您可以在 /proc/[pid]/fd 中计算它们。如果不是其中之一,请参见下文:wallyk 的答案

在c中,您可以列出目录并计算总数,或者列出目录内容:

 #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
Plan 9 来自贝尔实验室

于 2011-11-17T07:55:47.253 回答
6

一个可以在任何 *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);
于 2011-11-17T08:26:25.487 回答
1

OpenSSH 实现的closefrom功能非常类似于混合 wallyk 和 chown 已经提出的两种方法所需的功能,而且 OpenSSH 非常便携,至少在 Unix/Linux/BSD/Cygwin 系统之间是这样。

于 2011-11-17T10:35:13.513 回答
0

没有可移植的方法来获取打开描述符的数量(无论类型如何),除非您自己跟踪它们。

于 2011-11-17T08:00:49.910 回答