fpen返回由popen返回的FILE的错误

时间:2013-04-08 15:15:33

标签: c popen fgets

我正在尝试从我的C代码执行命令行,但是当我到达fgets()函数时,我得到了一个N​​ULL错误。

void executeCommand(char* cmd, char* output) {
    FILE *fcommand;
    char command_result[1000];
    fcommand = popen(cmd, "r");
    if (fcommand == NULL) {
        printf("Fail: %s\n", cmd);
    } else {
        if (fgets(command_result, (sizeof(command_result)-1), fcommand) == NULL)
             printf("Error !");
        strcpy(output, command_result);
    }
    pclose(fcommand);
}

我的命令是:

java -jar <parameters>

为什么我有来自fgets的NULL结果,尽管当我尝试在终端中执行相同的命令时,它按预期工作。

1 个答案:

答案 0 :(得分:4)

  

fgets()从流中读取最多一个小于大小的字符   并将它们存储到s指向的缓冲区中。读后停止了   EOF或换行符。如果读取换行符,则将其存储到缓冲区中。 “\ 0”存储在缓冲区中的最后一个字符之后。

简而言之,popen()正在执行fork()并且您试图在cmd引发的程序产生输出之前读取管道,因此没有数据管道和管道上的第一个读取将返回EOF,因此fgets()返回而不获取数据。你需要睡觉,进行民意调查或进行阻止阅读。