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

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/7976769/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-05 06:57:33  来源:igfitidea点击:

Getting count of current used file descriptors from C code

clinux

提问by Vivek Goel

Is there a C API to get the:

是否有 C API 来获取:

  1. Current used file descriptors system wide
  2. Current used file descriptors of the current process
  1. 当前使用的文件描述符系统范围
  2. 当前进程的当前使用的文件描述符

采纳答案by R.. GitHub STOP HELPING ICE

For the current process count, you can use getrlimitto get the file descriptor limit, then iterate over all integers from 0 to that limit and try calling fcntlwith the F_GETFDcommand. It will succeed only on the file descriptors which are actually open, letting you count them.

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

Edit:I now have a better way to do it. After getting the rlimit, make a large array of struct pollfd(as large as the limit if possible; otherwise you can break it down into multiple runs/calls) with each fd in the range and the eventsmember set to 0. Call pollon the array with 0 timeout, and look for the POLLNVALflag in the reventsfor each member. This will tell you which among a potentially-huge set of fds are invalid with a single syscall, rather than one syscall per fd.

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

回答by Some programmer dude

Since you say you are on Linux, you can open the folder /proc/self/fd/which should contain symbolic links to all open file descriptors.

既然你说你在 Linux 上,你可以打开文件夹/proc/self/fd/,该文件夹应该包含所有打开的文件描述符的符号链接。

回答by Polynomial

You can read /proc/sys/fs/file-nrto find the total number of allocated and free file system handles as well as the maximum allowed.

您可以阅读/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

To calculate the number that are currently in use, just do allocated - free. You could also calculate a percentage of used descriptors by doing ((allocated - free) / max) * 100

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

As for per-process, I'm not sure of any programmatic way you can do it.

至于每个进程,我不确定您可以使用任何编程方式。

Here's a tutorial on how to do it with lsofanyway: http://linuxshellaccount.blogspot.com/2008/06/finding-number-of-open-file-descriptors.html

这是一个关于如何使用的教程lsofhttp: //linuxshellaccount.blogspot.com/2008/06/finding-number-of-open-file-descriptors.html

回答by MD XF

I'm not positive about file descriptors, but you can easily check <stdio.h>files.

我还不能肯定有关文件的描述,但你可以很容易地检查<stdio.h>文件。

In stdio.h, __sF, is a file array that stores every FILE. (googling __sFshows many stdios with a matching keyword).

stdio.h, __sF, 是一个文件数组,它存储每个FILE. (谷歌搜索__sF显示许多stdio具有匹配关键字的 s)。

If a FILE's flags are empty, the file is not in use. Therefore, we can simply walk through __sF, checking the flag of each FILEin the array.

如果 aFILE的标志为空,则该文件未在使用中。因此,我们可以简单地遍历__sF,检查FILE数组中每个的标志。

#include <stdio.h>

int getOpenFileCount(void)
{
    int fileCount;

    for (fileCount = 0; __sF[fileCount]._flags != 0; fileCount++)
        continue;

    return fileCount;
}