我试图从我的 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 结果,尽管当我尝试在终端中执行相同的命令时,它按预期工作。
fgets() 从流中最多读入一个小于 size 的字符并将它们存储到 s 指向的缓冲区中。读取在 EOF 或换行符后停止。如果读取换行符,则将其存储到缓冲区中。'\0' 存储在缓冲区中最后一个字符之后。
简而言之,popen()
正在执行 afork()
并且您试图在由 引起的程序产生输出之前从管道中读取cmd
数据,因此管道上没有数据,并且管道上的第一次读取将返回EOF
,因此fgets()
返回而不获取数据。您要么需要睡觉,要么进行轮询,要么进行阻塞读取。