【发布时间】:2011-11-02 06:59:47
【问题描述】:
是否有 C API 来获取:
- 系统范围内当前使用的文件描述符
- 当前进程当前使用的文件描述符
【问题讨论】:
是否有 C API 来获取:
【问题讨论】:
为了补充Some programmer dude 的回答,获取当前进程的打开 fd 数量的最有效(在空间和时间方面)方法是在可用的情况下遍历/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;
}
【讨论】:
对于当前进程计数,您可以使用getrlimit 获取文件描述符限制,然后遍历从 0 到该限制的所有整数并尝试使用F_GETFD 命令调用fcntl。它只会在实际打开的文件描述符上成功,让您计算它们。
编辑:我现在有了更好的方法。获得rlimit 后,创建一个struct pollfd 的大数组(尽可能大;否则您可以将其分解为多个运行/调用),范围内的每个fd 和events 成员设置为0. 在数组上调用poll,超时时间为0,并在revents 中为每个成员查找POLLNVAL 标志。这将告诉您在一组潜在的巨大 fd 中,哪些是通过单个系统调用无效的,而不是每个 fd 一个系统调用。
【讨论】:
您可以阅读/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
【讨论】:
dup 或fork 的影响。
allocated 告诉您自启动以来分配的数量,free 告诉您已释放的数量。 allocated - free = 当前在系统上打开的号码。如果您只想知道系统上分配了多少文件描述符,只需查看allocated。还是我在想一些不同的东西?
dup、dup2、fcntl/F_DUPFD 或跨越fork 的继承创建)所有这些都共享属性,如文件中的当前偏移量、附加标志等模式等,并且打开的文件描述在引用它的所有个文件描述符都关闭之前不会关闭。
既然你说你在 Linux 上,你可以打开文件夹 /proc/self/fd/,它应该包含指向所有打开的文件描述符的符号链接。
【讨论】:
我对文件描述符并不肯定,但您可以轻松查看<stdio.h> 文件。
在stdio.h 中,__sF 是一个文件数组,用于存储每个FILE。 (googling __sF 显示许多带有匹配关键字的 stdios)。
如果FILE 的标志为空,则该文件未在使用中。因此,我们可以简单地遍历__sF,检查数组中每个FILE 的标志。
#include <stdio.h>
int getOpenFileCount(void)
{
int fileCount;
for (fileCount = 0; __sF[fileCount]._flags != 0; fileCount++)
continue;
return fileCount;
}
【讨论】:
error: ‘__sF’ undeclared (first use in this function)。