为什么我的popen失败了

时间:2014-08-07 17:45:09

标签: c popen

我的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.

我在崩溃后检查并且系统有足够的内存..

2 个答案:

答案 0 :(得分:3)

strerrorerrno是您的朋友。

链接的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查看打开的文件描述符列表。