为什么popen不抓取qemu的输出?
Why does popen not grab the output of qemu?
下面的代码适用于 /bin/ls 和其他程序,但不适用于 qemu。我怎样才能用popen得到qemu的输出流?
我 运行 qemu-x86_64 -d cpu /bin/ls
并期望获得与 qemu 相同的输出,但在它之前有一个“read:”。当我 运行 这只是控制台中的正常 qemu 输出。
int main()
{
/* Call program */
FILE* file = popen("/bin/ls", "r");
if(file == NULL)
{
perror("popen");
return 0;
}
/* output stream of program*/
char *out = NULL;
size_t outlen = 0;
/*iterate through program output stream line by line */
while (getline(&out, &outlen, file) >= 0)
{
/* print output stream */
printf("read: %s", out);
}
/* cleanup */
pclose(file);
free(out);
return 0;
}
正如@rici 指出的那样,qemu 实际上不会打印到 stdout
。 Qemu 打印到 stderr
并将输出从 stderr
重定向到 stdout
以便 popen 捕获它我只需要在执行的命令后面添加 2>&1
。
所以不是 运行宁:
FILE* file = popen("qemu-x86_64 -d cpu /bin/ls", "r");
我需要 运行:
FILE* file = popen("qemu-x86_64 -d cpu /bin/ls 2>&1", "r");
下面的代码适用于 /bin/ls 和其他程序,但不适用于 qemu。我怎样才能用popen得到qemu的输出流?
我 运行 qemu-x86_64 -d cpu /bin/ls
并期望获得与 qemu 相同的输出,但在它之前有一个“read:”。当我 运行 这只是控制台中的正常 qemu 输出。
int main()
{
/* Call program */
FILE* file = popen("/bin/ls", "r");
if(file == NULL)
{
perror("popen");
return 0;
}
/* output stream of program*/
char *out = NULL;
size_t outlen = 0;
/*iterate through program output stream line by line */
while (getline(&out, &outlen, file) >= 0)
{
/* print output stream */
printf("read: %s", out);
}
/* cleanup */
pclose(file);
free(out);
return 0;
}
正如@rici 指出的那样,qemu 实际上不会打印到 stdout
。 Qemu 打印到 stderr
并将输出从 stderr
重定向到 stdout
以便 popen 捕获它我只需要在执行的命令后面添加 2>&1
。
所以不是 运行宁:
FILE* file = popen("qemu-x86_64 -d cpu /bin/ls", "r");
我需要 运行:
FILE* file = popen("qemu-x86_64 -d cpu /bin/ls 2>&1", "r");