如何在Mac OS X上增加C中"最大打开文件"的限制

ace*_*mtp 6 c macos system ulimit

Mac OS X上最大打开文件的默认限制为256(ulimit -n),我的应用程序需要大约400个文件处理程序.

我尝试用setrlimit()更改限制,但即使函数正确执行,我仍然限制为256.

这是我使用的测试程序:

#include <stdio.h>
#include <sys/resource.h>

main()
{
  struct rlimit rlp;

  FILE *fp[10000];
  int i;

  getrlimit(RLIMIT_NOFILE, &rlp);
  printf("before %d %d\n", rlp.rlim_cur, rlp.rlim_max);

  rlp.rlim_cur = 10000;
  setrlimit(RLIMIT_NOFILE, &rlp);

  getrlimit(RLIMIT_NOFILE, &rlp);
  printf("after %d %d\n", rlp.rlim_cur, rlp.rlim_max);

  for(i=0;i<10000;i++) {
    fp[i] = fopen("a.out", "r");
    if(fp[i]==0) { printf("failed after %d\n", i); break; }
  }

}
Run Code Online (Sandbox Code Playgroud)

输出是:

before 256 -1
after 10000 -1
failed after 253
Run Code Online (Sandbox Code Playgroud)

我不能要求使用我的应用程序的人在/ etc文件或其他内容中查找.我需要应用程序自己完成它.

Dum*_*001 5

rlp.rlim_cur = 10000;

两件事情.

1.大声笑.显然你在Mac OS X'stdio中发现了一个错误.如果我修复你的程序/添加错误处理/ etc并用open()系统调用替换fopen(),我可以很容易地达到10000的限制(比我的10.6.3'OPEN_MAX限制10240低240 fds)

第2位.RTFM : man setrlimit. 最大打开文件的情况必须特别针对OPEN_MAX进行处理.


ace*_*mtp 5

etresoft在苹果讨论板上找到答案:

这里的整个问题是你的printf()函数.当您调用printf()时,您正在将内部数据结构初始化为特定大小.然后,调用setrlimit()尝试调整这些大小.该函数失败,因为您已经在printf()中使用了这些内部结构.如果使用两个rlimit结构(一个用于before,一个用于after),并且在调用setrlimit之后不打印它们,您会发现即使在命令行程序中也可以更改当前进程的限制.最大值为10240.