C 为什么打开的文件描述符数量没有增加?

C 为什么打开的文件描述符数量没有增加?,c,linux,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); }

我已经创建了一个小型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);
}
#包括
#包括
#包括
int main()
{
int i,fd[9000];

对于(i=0;i首先,您不检查
open
的返回值。如果您超过了打开描述符的限制,
open
返回
-1
,并将
errno
设置为
EMFILE


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

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

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

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


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

您应该关闭文件,当您使用
ulimit-n
时,您将看到打开文件的最大数量,您可以通过
ulimit-n number
ulimit C function
ulimit.h


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

此函数有效,并且
lsof./test.txt | wc-l
报告1021次成功打开。(程序本身也是如此。)

#包括
#包括
#包括
int main()
{
int i,fd[9000];

对于(i=0;i您是否希望程序或系统打印错误消息?为什么您希望程序或系统打印错误消息而不是
open
返回-1表示失败,没有标准输出消息或标准错误?如果您不检查
open
的返回值,您如何知道它没有超出限制?(因为它确实存在)@EricPostFischil:我正在检查
lsof
数量,但没有增加。可能超过2k。可能系统文件表上有lsof报告,并且您的test.txt文件的打开/链接计数在0到9000之间。或者更大。顺便说一句:如果您不知道该工具(lsof)是什么报告,您为什么要使用它?它不会,如果它们具有相同的句柄,那么它们将同时适用于这两个对象,它们将表示相同的文件句柄。@kingsmasher1:
lsof
不会显示比前2000个打开的文件更多的文件,因为没有比前2000个打开的文件更多的文件(或您的限制)。@kingsmasher1:“默认大小”不是“你的
ulimit-n是什么?”的答案。答案是一个特定的数字,比如8192、2048或256。@kingsmasher1-huh?。好吧,请准确阅读例如@kingsmasher1,因为你已经达到了软限制…(1021+stdin+stdout+stderr==1024)@kingsmasher1:我不熟悉Linux的详细信息。但是:系统进程打开的文件不应计入进程的限制。进程中由库加载机制打开的文件(即使是由链接器或加载程序插入,而不是由您显式插入)应该算作进程的一部分,但它们可能不会保持打开状态。我不确定内存映射文件是否算作打开的文件。我想你还没有理解我的问题。当我打算检查阈值限制时,为什么要关闭文件?
#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;
}