我有一个 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);
会发生两种不同的情况。
loop 设备设置完成后,输出如下:
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”内的标准输出只是在终端中自行打印。我不仅需要在设置循环设备时读取输出,还需要在未设置时读取输出。那么,有人可以解释如何解决这个问题,以便我可以存储这两种情况的标准输出吗?
附言。我用“pipe”、“fgets”和“getline”尝试过“dup2”,但它们都以类似方式失败。
最佳答案
管道只从标准输入到标准输出。错误消息,例如
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 允许您进行重定向)。
关于c++ - 未使用 "popen"和 "read"函数读取标准输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39746088/