【发布时间】:2011-11-17 07:54:34
【问题描述】:
在 *NIX 系统上,有没有办法找出当前运行的进程中有多少打开的文件句柄?
我正在从正在运行的相关进程中寻找用于 C 语言的 API 或公式。
【问题讨论】:
标签: c++ c linux unix setrlimit
在 *NIX 系统上,有没有办法找出当前运行的进程中有多少打开的文件句柄?
我正在从正在运行的相关进程中寻找用于 C 语言的 API 或公式。
【问题讨论】:
标签: c++ c linux unix setrlimit
在某些系统上(见下文),您可以在 /proc/[pid]/fd 中计算它们。如果不是其中之一,请参阅以下内容:wallyk's answer。
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 文件系统的操作系统包括,但 不限于:
索拉里斯
IRIX
Tru64 UNIX
BSD
Linux(将其扩展到与进程无关的数据)
IBM AIX(其实现基于 Linux 以提高兼容性)
QNX
贝尔实验室的计划 9
【讨论】:
想到的适用于任何 *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 系统之间是这样。
【讨论】:
没有便携式方法可以获取打开的描述符的数量(无论类型),除非您自己跟踪它们。
【讨论】: