从C代码中获取当前使用的文件描述符的数量

Viv*_*oel 17 c linux

是否有一个C API来获取:

  1. 系统范围内当前使用的文件描述符
  2. 当前使用的当前进程的文件描述符

R..*_*R.. 20

对于当前进程计数,您可以使用getrlimit获取文件描述符限制,然后迭代从0到该限制的所有整数并尝试fcntl使用该F_GETFD命令调用.它只会在实际打开的文件描述符上成功,让你计算它们.

编辑:我现在有一个更好的方法来做到这一点.获取之后rlimit,创建一个大数组struct pollfd(如果可能的话,尽可能大的限制;否则你可以将其分解为多个运行/调用),每个fd在范围内,并且events成员设置为0. poll使用0超时调用数组,并POLLNVALrevents每个成员中查找标志.这将告诉您哪一个潜在的巨大fds集合在一个系统调用中是无效的,而不是每个fd一个系统调用.

  • @MattJ:我有更好的方法去做.看我的编辑. (3认同)
  • 丑陋(并且可能效率低下)的黑客攻击,但它似乎是唯一干净的方法.由于某种原因,似乎这是POSIX中缺少的API. (2认同)

Som*_*ude 13

由于您说您使用的是Linux,因此可以打开/proc/self/fd/应包含指向所有打开文件描述符的符号链接的文件夹.


Pol*_*ial 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
Run Code Online (Sandbox Code Playgroud)

要计算当前使用的数量,请执行此操作allocated - free.您还可以通过执行来计算已使用描述符的百分比((allocated - free) / max) * 100

至于每个进程,我不确定你可以采用任何编程方式.

以下是有关如何使用它的教程lsof:http://linuxshellaccount.blogspot.com/2008/06/finding-number-of-open-file-descriptors.html