-2

我创建了一个小型 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

4 回答 4

5

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

该程序仅完成for循环,无法打开更多文件。不显示任何消息。

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

进程受限于其软限制指定的文件数。软限制是“软”的,因为它可以更改为硬限制的值。但是,直到软限制改变,它是打开文件数的限制。

于 2013-10-23T16:52:07.893 回答
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;
}
于 2013-10-23T17:12:46.133 回答
0

首先,您不检查open. 如果超过打开描述符的限制,则open返回-1并设置errnoEMFILE.

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

于 2013-10-23T16:51:57.250 回答
0

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

为了您的目的,您应该使用int getrlimit(int resource, struct rlimit *rlim); 函数。

于 2013-10-23T16:57:16.760 回答