我的c代码是
size_t n=0;
char *str = (char *)malloc(sizeof(char)* 1000)
FILE *fp = popen(" cat /conf/a.txt" ,"r" );
// my program comes in this function only if /conf/a.txt exists
getline(&str, &n, fp); <== crash if fp is null
我的调试器显示有时我得到fp为null,因此我的程序在第6行崩溃。有时我会得到有效的歌曲并且它会通过。
是什么,它控制着这种行为。我在上面的代码中找不到问题。一些帮助表示赞赏。
我知道我可以检查fp == null但这不是我的问题。我只想知道,知道文件肯定存在,为什么在某些情况下fp会变为null。
popen的人说The popen() function returns NULL if the fork(2) or pipe(2) calls fail, or if it cannot allocate memory.
我在崩溃后检查并且系统有足够的内存..
答案 0 :(得分:3)
链接的C ++引用示例:
/* strerror example : error list */
#include <stdio.h>
#include <string.h>
#include <errno.h>
int main ()
{
FILE * pFile;
pFile = fopen ("unexist.ent","r");
if (pFile == NULL)
printf ("Error opening file unexist.ent: %s\n",strerror(errno));
return 0;
}
示例输出:
打开文件undeist.ent时出错:没有这样的文件或目录
使用此方法在失败后检查errno将允许您更好地诊断问题,因为它将打印更具体的错误消息。文件无法打开的原因有很多:没有权限,路径错误,文件被另一个进程锁定,读取时出现IO错误等等。最终你的问题似乎是问为什么开放失败了。使用这些工具将为您解答。
标记更改更新:
我已经引用并链接到C ++资源,但是包含errno.h的C语言也可以使用sterror和errno。
答案 1 :(得分:0)
popen()也将失败。我在服务器应用程序中遇到一种情况,即定期扫描一个目录中的文件,有一种情况是没有进行fclose调用。因此,几个小时后,从那时起连续的popen()调用将失败,我们达到了1024个打开文件句柄的限制。
您可以使用ps -aux | grep {PROC_NAME}以检索进程ID。 然后使用sudo ls -l / proc / {PROC_ID} / fd查看打开的文件描述符列表。