在*NIX系统中,有没有办法查找当前正在运行的进程中有多少个打开的文件句柄?我正在寻找一个API或C语言公式,用于在所讨论的运行进程内部使用。
在某些系统上(见下文),您可以在/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;
}
ls -l /proc/[pid]/fd/ | wc -l
一个想法是在任何*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);
OpenSSH 实现了一个 closefrom
函数,它执行的操作与 wallyk 和 chown 已经提出的两种方法非常相似,而且 OpenSSH 在 Unix/Linux/BSD/Cygwin 系统之间非常易于移植。
没有一种便携式的方法可以获取打开描述符的数量(无论类型如何),除非您自己跟踪它们。