2
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

4 回答 4

11

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

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

于 2012-06-10T06:58:20.433 回答
4

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

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

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

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

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

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

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

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

$ lsof

您还可以使用lsof来获取打开文件的计数:

$ lsof | wc -l
于 2012-06-10T04:53:36.030 回答
1

这看起来与您遇到的问题相似,但我不完全确定它是否会帮助您解决问题。也许值得一瞧:

在 C 中写入文件的问题

于 2012-06-10T04:42:58.643 回答
1

正确,我遇到了同样的错误消息,发现我试图在函数中关闭文件,但不是在打开文件的位置。所以我然后关闭了它打开的功能,后来一切都很好。

于 2018-07-22T10:37:26.697 回答