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

时间:2011-11-02 06:59:48

标签: c linux

是否有C API来获取:

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

5 个答案:

答案 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;
}