使用管道读取dd命令输出的问题

时间:2010-12-22 10:46:30

标签: c++ linux popen dd

我正在开发一个应用程序,我想将dd命令的输出(进度信息)重定向到我的C ++程序,但它实际上并没有得到输出,这里是代码

FILE * progressInfo = popen("gzip -dc backup/backup.img.gz | pv -ptrbe -i 2 -s 2339876653 | dd of=/dev/sdb","r");
if(!progressInfo)
{
return -1;
}
char buf[1024];
while(fgets(buff, sizeof(buff),progressInfo)!=NULL)
{
    std::cout << buff << endl;
}

但问题是buff未收到进度信息,并且输出会在终端上连续打印,并且while(fgets(buff, sizeof(buff),progressInfo)!=NULL)上的程序暂停,dd操作完成后,执行循环块的下一行。

如果有人知道为什么输出没有返回到buff,并且它在终端上不断重新调整?

1 个答案:

答案 0 :(得分:3)

输出可能写入标准错误而不是标准输出。只需在命令字符串的最后添加“2&gt;&amp; 1”即可看到输出(注意前导空格)。