c++ - 未使用 "popen"和 "read"函数读取标准输出

标签 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);

会发生两种不同的情况。

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/

相关文章:

cocoa - 在应用程序文件夹中找不到 Mac 应用程序

c++ - 如何从不断更新的文件中读取和提取信息?

c++ - 10 位数字但不是 18 位数字的整数溢出?

linux - 使用安装命令时如何正确重定向 bash 脚本执行输出

regex - 在 VI 中搜索字母和数字

linux - 如何登录到远程机器

python - 如果使用颜色提示,如何修复 Python readline 中的列计算

c++ - 尝试绘制 Sprite 图时出现 sfml 错误

c++ - 无法将 int 分配给返回类的成员 int

java - UnsatisfiedLinkError 加载 OpenCV (Linux)