从C代码获取当前使用的文件描述符的计数
是否有一个C API来获取:从C代码获取当前使用的文件描述符的计数,c,linux,C,Linux,是否有一个C API来获取: 系统范围内当前使用的文件描述符 当前进程的当前使用的文件描述符 既然您说您在Linux上,您可以打开文件夹/proc/self/fd/,其中应该包含指向所有打开的文件描述符的符号链接。您可以阅读/proc/sys/fs/file nr,以查找已分配和可用文件系统句柄的总数以及允许的最大值 [root@box proc]# cat /proc/sys/fs/file-nr 3853 908 53182 | | | |
既然您说您在Linux上,您可以打开文件夹
/proc/self/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
。您还可以通过执行((分配-免费)/max)*100
至于每个进程,我不确定是否有任何编程方式可以做到这一点
这里有一个关于如何使用
lsof
的教程:对于当前进程计数,您可以使用getrlimit
获取文件描述符限制,然后迭代从0到该限制的所有整数,并尝试使用F_GETFD
命令调用fcntl
。它只会在实际打开的文件描述符上成功,让您计算它们
编辑:我现在有了更好的方法。获取
rlimit
后,创建一个大型struct pollfd
数组(尽可能大;否则可以将其分解为多个运行/调用),每个fd在范围内,并且事件
成员设置为0。在超时为0的数组上调用poll
,并在revents
中为每个成员查找POLLNVAL
标志。这将告诉您,在一组潜在的大量fd中,哪一个fd对于单个系统调用无效,而不是每个fd一个系统调用无效。我对文件描述符不是很肯定,但您可以轻松地检查
文件
在stdio.h
中,是一个文件数组,用于存储每个文件。(显示许多带有匹配关键字的stdio
s)
如果文件
的标志为空,则该文件不在使用中。因此,我们可以简单地遍历\uu sF
,检查数组中每个文件的标志
#include <stdio.h>
int getOpenFileCount(void)
{
int fileCount;
for (fileCount = 0; __sF[fileCount]._flags != 0; fileCount++)
continue;
return fileCount;
}
#包括
int getOpenFileCount(无效)
{
int文件计数;
对于(fileCount=0;uu sF[fileCount]。_标志!=0;fileCount++)
继续;
返回文件计数;
}
为了补充on的答案,获取当前流程中打开的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;
}
#包括
#包括
#包括
整数计数\u打开\u fds(无效){
DIR*dp=opendir(“/proc/self/fd”);
结构方向*de;
整数计数=-3;/','..,dp
如果(dp==NULL)
返回-1;
而((de=readdir(dp))!=NULL)
计数++;
(无效)closedir(dp);
返回计数;
}
我相信这些实际上是打开文件描述的计数,而不是文件描述符,即值不受dup
或fork
分配的告诉您自启动以来分配的数量,空闲的告诉您已释放的数量<代码>已分配-免费
=系统上当前打开的号码。如果您只想知道系统上分配了多少个文件描述符,只需查看分配的
。或者我想的是不同的东西吗?文件描述符和打开文件描述有细微的不同。每个打开的文件描述可以有许多引用它的文件描述符(由dup
,dup2
,fcntl/F_DUPFD
,或跨fork
的继承创建),所有这些描述符都共享文件中的当前偏移量、附加模式等标志。,在所有引用它的文件描述符都关闭之前,打开的文件描述不会关闭。@在我的系统上,我得到以下o/p cat/proc/sys/fs/file nr 8064 0 297986是否意味着我使用了8064文件descriptor@R.. - 引用到“某处”的文件描述符是否仍应算作打开?我不熟悉它的内部结构,但我对“open”(作为一个主要使用基于GC的语言的开发人员)的定义是,某些东西正在积极地引用它。尝试您的代码,得到错误:“\uu sF”未声明(此函数首次使用)
@Elizermiron这是因为它是一个非标准的BSD扩展,如双下划线所示。