C(Linux)中的fopen返回“打开的文件过多”

时间:2012-06-10 04:36:23

标签: c linux fopen

static char filename[128] = "trace.txt";

g_file = fopen(filename, "w");
if(NULL == g_file)
{
       printf("Cannot open file %s.error %s\n",filename,strerror(errno));
       exit(1);
}

我试图在写入模式下打开一个名为trace.txt的空文本文件(在我的工作目录中)。 该程序在我的目录中创建一个空文件trace.txt。但是检查(NULL == g_file) 返回true并返回错误代码24(打开文件太多。)。知道这是为什么。这是我在程序中打开的第一个文件。

令人惊讶的是,代码通过指定的名称在我的工作目录中创建一个空文件。但是由于某种原因,检查空文件指针是否成功。 :(

4 个答案:

答案 0 :(得分:9)

您可能有文件描述符泄漏 如果您的代码一直打开文件,从不关闭它们,您迟早会达到限制,然后fopen将会失败。

您可以通过打印打开文件时获得的文件描述符编号来检查这一点。如果他们继续增长,你就会有泄漏。

答案 1 :(得分:3)

这很可能是由于您的系统达到了允许的最大打开文件句柄。

您可以通过运行以下命令轻松测试:

$ dd if=/dev/urandom of=test.dat bs=16 count=1

如果您没有文件句柄,则应该提供相同或类似的错误。

您可以使用以下某些命令来解决此问题:

要查看允许的最大打开文件数:

$ cat /proc/sys/fs/file-max

要查看当前打开的文件(请记住这包括设备文件,套接字等):

$ lsof

您还可以使用lsof来计算打开的文件:

$ lsof | wc -l

答案 2 :(得分:1)

这看起来与您所拥有的问题类似,但我不完全确定它是否能帮助您解决问题。可能值得一看:

Problem with writing to file in C

答案 3 :(得分:1)

正确,我遇到了同样的错误消息,发现我试图关闭某个函数中的文件,但没有打开它的位置。所以我然后在打开它的函数中关闭了,后来一切正常。