fgets 为 popen 返回的 FILE 返回错误

The*_*den 5 c fgets popen

我试图从我的 C 代码执行命令行,但是当我到达 fgets() 函数时,我得到了一个 NULL 错误。

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);
}
Run Code Online (Sandbox Code Playgroud)

我的命令是:

java -jar <parameters>
Run Code Online (Sandbox Code Playgroud)

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

K S*_*iel 4

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

简而言之,popen()正在执行 afork()并且您试图在由 引起的程序产生输出之前从管道中读取cmd数据,因此管道上没有数据,并且管道上的第一次读取将返回EOF,因此fgets()返回而不获取数据。您要么需要睡觉,要么进行轮询,要么进行阻塞读取。

  • 是的......但睡眠是最糟糕的解决方案,因为它要么(a)有在输出准备好之前醒来的风险,要么(b)让用户在输出准备好后等待很长时间。最好的答案是在管道上进行阻塞读取。 (2认同)