在Linux中,使用“fopen”打开的文件数量的最大限制是多少?

8

在Linux中,fopen可以同时打开的文件数的最大值是多少?


短而简洁。这取决于情况。 - Nik Bougalis
5
取决于其他程序打开了多少文件,以及硬编码的内核限制和各种ulimit设置。 - Drew McGowen
1
RTFM:http://www.linuxhowtos.org/Tips%20and%20Tricks/ulimit.htm - Marc B
1
<stdio.h> FOPEN_MAX - BLUEPIXY
4个回答

11
实现必须在 <stdio.h> 中提供 FOPEN_MAX。这是实现保证能够同时打开的文件数的最小值。你可能会打开更多文件,但唯一确定的方法是进行测试。
请注意,内核限制与此相分离,它告诉您可以使用 opencreat 和其他操作系统调用(潜在地)打开多少文件。您的 C 实现标准库可以(而且通常会)强制执行其自己的限制,例如通过静态分配一个 FILE 数组。理论上,您可以打开的最大数量是内核和库实现强制执行的限制的最小值,但内核的限制几乎总是(远远)更高。
一般来说,如果您关心这个问题,您 可能 正在做一些错误的事情。

这个限制的一个用例是实现远程文件操作 RPC,其中需要区分本地机器的 fd 和远程机器的 fd。 - yeshengm

3

您可以通过以下方式查看操作系统内核允许的最大打开文件数:

cat /proc/sys/fs/file-max

内核文档引用:

file-max 的值表示 Linux 内核将分配的最大文件句柄数。当您收到大量有关文件句柄耗尽的错误消息时,您可能需要增加此限制。


4
可能是用户限制 ;)请参见ulimit -n - nullpotent
3
FOPEN_MAX不是一个限制。它提供了实现保证可以同时打开的最小流数。 - jh314

2

这段代码应该能告诉你的机器最大可用内存。在相同的文件夹中创建一个名为“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);
  }
}

1
这是POSIX标准定义的。删除它会造成可移植性问题。此外,该宏在glibc.info中提到(至少在redhat-7.1中)。请参考下面的链接limits.h中未定义OPEN_MAX

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接