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

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

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

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

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