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

Jac*_*cob 6 c c++ linux

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);
   }
}
Run Code Online (Sandbox Code Playgroud)

R..*_*R.. 7

它不会等到ping完成.相反,ping正在等待stdout缓冲区填满之后才写入任何内容.避免这种情况的唯一方法涉及伪ttys.要么你应该放弃popen,并编写代码来自己使用ping子进程,并使用伪终端进行通信(这是很容易与非标准的,但广泛使用的forkpty功能),或者你可以写一个运行ping通伪PTY一个包装程序和抓住的输出,并且将它写入没有缓冲stdout.

  • 那无济于事.所有这一切都是在*输入缓冲区*上禁用缓冲.但有问题的缓冲是在其*输出缓冲区*中的ping程序内部.你绝对无法控制它. (3认同)