Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从C代码获取当前使用的文件描述符的计数_C_Linux - Fatal编程技术网

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

从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 | | | |

是否有一个C API来获取:

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

  • 既然您说您在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扩展,如双下划线所示。