5

我正在尝试从我的 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);
}

我的命令是:

java -jar <parameters>

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

4

1 回答 1

4

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

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

于 2013-04-08T15:21:23.377 回答