是否有C API来获取:
答案 0 :(得分:17)
对于当前进程计数,您可以使用getrlimit
来获取文件描述符限制,然后迭代从0到该限制的所有整数,并尝试使用fcntl
命令调用F_GETFD
。它只会在实际打开的文件描述符上成功,让你计算它们。
编辑:我现在有了更好的方法。获得rlimit
之后,创建一个大数组struct pollfd
(如果可能的话,尽可能大的限制;否则你可以将它分解为多个运行/调用),每个fd在范围内events
1}}成员设置为0.在0超时的数组上调用poll
,并在每个成员的POLLNVAL
中查找revents
标志。这将告诉您哪一个潜在的巨大fds集合在一个系统调用中是无效的,而不是每个fd一个系统调用。
答案 1 :(得分:13)
由于您说您使用的是Linux,因此可以打开文件夹/proc/self/fd/
,该文件夹应包含指向所有打开的文件描述符的符号链接。
答案 2 :(得分:12)
您可以阅读/proc/sys/fs/file-nr
以查找已分配和免费文件系统句柄的总数以及允许的最大值。
[root@box proc]# cat /proc/sys/fs/file-nr
3853 908 53182
| | |
| | |
| | max: maximum open file descriptors
| free: total free allocated file descriptors
allocated: total allocated file descriptors since boot
要计算当前使用的数量,请执行allocated - free
。您还可以通过执行((allocated - free) / max) * 100
至于每个进程,我不确定你可以采用任何编程方式。
以下是有关如何使用lsof
进行操作的教程:http://linuxshellaccount.blogspot.com/2008/06/finding-number-of-open-file-descriptors.html
答案 3 :(得分:0)
我对文件描述符并不乐观,但您可以轻松检查<stdio.h>
个文件。
在stdio.h
中,__sF
是一个存储每个FILE
的文件数组。 (googling __sF
显示许多带有匹配关键字的stdio
。
如果FILE
的标志为空,则表示该文件未被使用。因此,我们可以简单地浏览__sF
,检查数组中每个FILE
的标记。
#include <stdio.h>
int getOpenFileCount(void)
{
int fileCount;
for (fileCount = 0; __sF[fileCount]._flags != 0; fileCount++)
continue;
return fileCount;
}
答案 4 :(得分:0)
要补充Some programmer dude的答案,获取当前进程打开的fds数量的最有效的方法(在空间和时间方面)是在可用的情况下走/proc/self/fds
。
这应该做到:
#include <dirent.h>
#include <stddef.h>
#include <sys/types.h>
int count_open_fds(void) {
DIR *dp = opendir("/proc/self/fd");
struct dirent *de;
int count = -3; // '.', '..', dp
if (dp == NULL)
return -1;
while ((de = readdir(dp)) != NULL)
count++;
(void)closedir(dp);
return count;
}