我创建了一个小型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
它没有增加。
可能是什么原因?
答案 0 :(得分:5)
这是预期的行为。一旦程序达到打开文件的限制,open
调用将返回-1,并且不再打开文件。
程序只完成for
循环,无法打开更多文件。没有消息显示。
根据从OP中提取的信息,其进程的打开文件的限制为1024. lsof
显示大约2000个文件打开,因为其进程有1024个,系统中的其他进程大约有1000个。
进程仅限于其软限制指定的文件数。软限制是“软”,因为它可以更改,达到硬限制的值。但是,在更改软限制之前,它是打开文件数量的限制。
答案 1 :(得分:0)
首先,您不检查open
的返回值。如果您超出了开放描述符的限制,open
会返回-1
并将errno
设置为EMFILE
。
其次,您正在打开同一个文件。这可能会也可能不会计入文件描述符限制。
答案 2 :(得分:0)
您应该关闭文件,当您使用ulimit -n
时,您会看到最大数量的打开文件,您可以通过ulimit -n NUMBER
或ulimit C function
从ulimit.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;
}