Linux 管道:通过 popen 获取 ping 的实时输出

6

Linux/C/管道:

我如何使用popen(或类似的系统调用)捕获ping命令的输出。目前,popen将等待ping命令完成,然后一起输出。

伪代码:

fp= popen("ping x.x.x.x", "r");
while(!feof(pFp))
{
   if(fgets(fp ...) // <==currently the code blocks here until ping finishes in popen
   { 
       printf(...real time ping output here);
   }
}

C还是C++?你的代码看起来像是C。 - ThiefMaster
你可能正在遭受缓冲问题的困扰。使用pipe(2)可以获得更多的控制。 - cdarke
1
@cdarke:这样做没有帮助。问题在于ping正在缓冲其输出。我肯定认为这是ping中的一个bug。如果它知道在休眠时不会有更多的输出(当它睡眠时),那么它应该在休眠之前刷新其输出... - R.. GitHub STOP HELPING ICE
1个回答

8
不是等待ping完成才返回结果,而是ping在写任何内容之前等待stdout缓冲区填满。避免这种情况的唯一方法涉及伪终端。要么放弃popen并编写代码来运行ping子进程并使用伪终端进行通信(这很容易使用非标准但广泛可用的forkpty函数),要么编写一个包装程序,通过伪终端运行ping并获取输出,并将其无缓冲地写入stdout。

谢谢,我也尝试了 setvbuf(fp, NULL, _IONBF, 0)。我期望由于缓冲已禁用,输出应立即可用。我不明白为什么这行不通。看起来我得按照你建议的做。 - Jacob
3
那样做没有帮助,它只是禁用了你的输入缓冲区,但问题出在ping程序中的输出缓冲区内部的缓冲上。你无法对此进行任何控制。 - R.. GitHub STOP HELPING ICE

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接