为什么打开文件描述符的数量不会增加?

时间:2013-10-23 16:44:15

标签: c linux

我创建了一个小型C程序来跨越Linux中打开文件描述符的系统限制。但我可以看到门槛不会越过。

这是C代码:

#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
int main()
{
  int i, fd[9000];
  for(i=0; i<9000; i++)
  {
   fd[i]=open("test.txt", O_RDWR);
  }
  while(1);
}

我希望它超越限制并给我一个错误信息。但是如果我在后台运行它并且lsof | wc -l它没有增加。

可能是什么原因?

4 个答案:

答案 0 :(得分:5)

这是预期的行为。一旦程序达到打开文件的限制,open调用将返回-1,并且不再打开文件。

程序只完成for循环,无法打开更多文件。没有消息显示。

根据从OP中提取的信息,其进程的打开文件的限制为1024. lsof显示大约2000个文件打开,因为其进程有1024个,系统中的其他进程大约有1000个。

进程仅限于其软限制指定的文件数。软限制是“软”,因为它可以更改,达到硬限制的值。但是,在更改软限制之前,它是打开文件数量的限制。

答案 1 :(得分:0)

首先,您不检查open的返回值。如果您超出了开放描述符的限制,open会返回-1并将errno设置为EMFILE

其次,您正在打开同一个文件。这可能会也可能不会计入文件描述符限制。

答案 2 :(得分:0)

您应该关闭文件,当您使用ulimit -n时,您会看到最大数量的打开文件,您可以通过ulimit -n NUMBERulimit C functionulimit.h更改。

出于您的目的,您应该使用int getrlimit(int resource, struct rlimit *rlim);功能。

答案 3 :(得分:0)

这个有效,lsof ./test.txt | wc -l报告1021成功打开。 (该计划本身也是如此。)

#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>

int main()
{
  int i, fd[9000];
  for(i=0; i<9000; i++)
  {
   fd[i]=open("test.txt", O_RDWR| O_CREAT, 0644);
   if (fd[i] < 0) break;
  }
 fprintf(stderr, "I is now %d\n" , i);
  while(1);
  return 0;
}