【问题标题】:problem in reading output of dd command using pipe使用管道读取 dd 命令输出的问题
【发布时间】:2010-12-22 10:46:30
【问题描述】:

我正在开发一个应用程序,我想将 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,并且在终端上不断地重新调整?

【问题讨论】:

    标签: c++ linux popen dd


    【解决方案1】:

    输出可能被写入标准错误而不是标准输出。只需在命令字符串的最后添加“2>&1”,您应该会看到输出(注意前导空格)。

    【讨论】:

    • 如果是这种情况,那么不是 dd 命令,而是其他命令之一写入标准错误。您可以通过将命令更改为以下内容将标准错误重定向到整个命令管道的标准输出: (gzip -dc backup/backup.img.gz | pv -ptrbe -i 2 -s 2339876653 | dd of=/dev /sdb) 2>&1
    • 现在行为发生了一些变化,终端上没有打印输出,但代码仍然在同一行停止......这意味着输出正在被重定向,但为什么它没有被重定向到管道?
    • dd 操作完成后,您是否看到程序打印的所有输出?
    • pv 如果不是终端(即isatty(2) == 0),则不会将进度报告写入标准错误,除非-f 选项强制执行。
    • 是的,但不是所有的输出,我的代码只打印输出的最后两行,即 5533841+0 记录输出 55​​33841+0 记录和复制的总字节数,但没有进度信息收到的代码..
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多