我有一个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",他们都失败了。
答案 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允许你进行重定向)。