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(打开文件太多。)。知道这是为什么。这是我在程序中打开的第一个文件。
令人惊讶的是,代码通过指定的名称在我的工作目录中创建一个空文件。但是由于某种原因,检查空文件指针是否成功。 :(
答案 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)
这看起来与您所拥有的问题类似,但我不完全确定它是否能帮助您解决问题。可能值得一看:
答案 3 :(得分:1)
正确,我遇到了同样的错误消息,发现我试图关闭某个函数中的文件,但没有打开它的位置。所以我然后在打开它的函数中关闭了,后来一切正常。