【问题标题】:Getting count of current used file descriptors from C code从 C 代码中获取当前使用的文件描述符的计数
【发布时间】:2011-11-02 06:59:47
【问题描述】:

是否有 C API 来获取:

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

【问题讨论】:

    标签: c linux


    【解决方案1】:

    为了补充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;
    }
    

    【讨论】:

      【解决方案2】:

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

      编辑:我现在有了更好的方法。获得rlimit 后,创建一个struct pollfd 的大数组(尽可能大;否则您可以将其分解为多个运行/调用),范围内的每个fd 和events 成员设置为0. 在数组上调用poll,超时时间为0,并在revents 中为每个成员查找POLLNVAL 标志。这将告诉您在一组潜在的巨大 fd 中,哪些是通过单个系统调用无效的,而不是每个 fd 一个系统调用。

      【讨论】:

        【解决方案3】:

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

        【讨论】:

        • 我相信这些实际上是打开文件描述的计数,而不是文件描述符,即该值不受dupfork 的影响。
        • allocated 告诉您自启动以来分配的数量,free 告诉您已释放的数量。 allocated - free = 当前在系统上打开的号码。如果您只想知道系统上分配了多少文件描述符,只需查看allocated。还是我在想一些不同的东西?
        • 文件描述符和打开的文件描述有细微的不同。每个打开的文件描述都可以有许多引用它的文件描述符(由dupdup2fcntl/F_DUPFD 或跨越fork 的继承创建)所有这些都共享属性,如文件中的当前偏移量、附加标志等模式等,并且打开的文件描述在引用它的所有个文件描述符都关闭之前不会关闭。
        • @Polynomial 在我的系统上我得到以下 o/p cat /proc/sys/fs/file-nr 8064 0 297986 这是否意味着我使用了 8064 个文件描述符
        • @R.. - 被称为“某处”的文件描述符是否仍算作打开?我不熟悉它的内部结构,但我对“开放”的定义(作为主要使用基于 GC 的语言的开发人员)是有东西在积极地引用它。
        【解决方案4】:

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

        【讨论】:

          【解决方案5】:

          我对文件描述符并不肯定,但您可以轻松查看&lt;stdio.h&gt; 文件。

          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)
          • @EliezerMiron 那是因为它是一个非标准的 BSD 扩展,如双下划线所示。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-03-24
          相关资源
          最近更新 更多