Stdout没有使用" popen"和"阅读"功能

时间:2016-09-28 11:25:26

标签: c++ linux terminal

我有一个c ++代码尝试运行losetup /dev/loop*并解析在终端上吐出的内容。

代码就是这样

char cmd[32] = {0, };
sprintf(cmd, "losetup /dev/loop%d", i);
FILE *fp;
fp = popen(cmd,"r");
char buf[1024];
read(fileno(fp), buf, 123);
printf("After read: %s\n", buf);

发生了两件不同的事情。

设置循环设备时,输出如下:

After read: /dev/loop0: [0802] ...Remaining ommitted

这就是我想要和期待的。

但是,当没有正确设置循环设备时,输出如下:

loop: can't get info on device /dev/loop1: No such device or address
After read:

如你所见," buf"是NULL,应该在里面的标准输出" buf"只是在终端上打印出来。我不仅需要在设置循环设备时读取输出,还需要在不设置循环设备时读取输出。那么,有人可以解释如何解决这个问题,以便我可以存储这两种情况的stdout吗?

PS。我试过" dup2"使用" pipe"," fgets"和" getline",他们都失败了。

1 个答案:

答案 0 :(得分:0)

管道仅从标准输入到标准输出。错误消息,例如

loop: can't get info on device /dev/loop1: No such device or address

转到标准错误。您可以通过重定向传递给popen的命令中的标准错误来解决此问题,例如,

sprintf(cmd, "losetup /dev/loop%d 2>&1", i);

因为它是一个shell命令(shell允许你进行重定向)。