【问题标题】:Maximum number of files that can be opened by c "fopen" in linuxlinux中c“fopen”可以打开的最大文件数
【发布时间】:2013-07-29 18:33:18
【问题描述】:

在Linux中cfopen最多可以同时打开多少个文件?

【问题讨论】:

标签: c fopen


【解决方案1】:

实现需要在<stdio.h>中提供FOPEN_MAX。这是实现保证可以同时打开的最小文件数。您可能可以打开更多,但知道这一点的唯一方法是测试。

请注意,内核限制与此不同——它告诉您可以(可能)使用opencreat 和其他操作系统调用打开多少文件。您的 C 实现的标准库可以(并且通常会)施加其自己的限制(例如,通过静态分配 FILE 的数组)。理论上,您可以打开的最大数字是内核和库实现施加的限制中的最小值——但内核的限制几乎总是(很多)更高。

一般来说,如果您关心这一点,那么您可能做错了什么。

【讨论】:

  • 这个限制的一个用例是实现远程文件操作RPC,需要区分本地机器的fd和远程机器的fd。
【解决方案2】:

您可以通过执行以下操作查看允许的最大打开文件数(内核限制):

cat /proc/sys/fs/file-max

Quote from kernel docs:

file-max中的值表示file-max的最大数量 Linux 内核将分配的句柄。当你得到很多 关于文件句柄用完的错误消息,您可能 想提高这个限制。

【讨论】:

  • 这可能是用户限制;)见ulimit -n
  • FOPEN_MAX 不是限制。它为您提供实现保证可以同时打开的最小流数
【解决方案3】:

此代码应该告诉您机器上的最大值。在同一文件夹中创建一个文件“test”并运行它。它基本上会一直打开文件,直到它不能再打开为止。

# include <assert.h>
# include <stdio.h>
# include <stdlib.h>
# include <unistd.h>
# include <sys/types.h>
# include <sys/stat.h>
# include <sys/wait.h>
# include <string.h>
# include <fcntl.h>


int main(){
  int t;

  for(;;){
    t = open("test", O_RDONLY);
    if (t < 0){
      perror("open");
      exit(1);
    }
    printf("%d: ok\n", t);
  }
}

【讨论】:

    【解决方案4】:

    它是由 POSIX 标准定义的。删除它会导致可移植性问题。此外,glibc.info 中提到了这个宏(至少在 redhat-7.1 中)。请参考下面的链接 OPEN_MAX not defined in limits.h.

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-05-10
      • 2015-07-28
      • 1970-01-01
      • 2011-10-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-10
      相关资源
      最近更新 更多