在C程序中使用未完成进程的输出

时间:2011-02-15 17:21:09

标签: c linux

我在linux环境中使用tcpstat。我想在C程序中捕获它的输出,即使它还没有完成。我尝试使用popen()函数,但它只能在程序完成后处理输出。我想在运行时处理tcpstat的输出,当它在标准输出上打印时。我该怎么做?

例如,

$ tcpstat -i wlan0 1
Time:1297790227 n=2 avg=102.50  stddev=42.50    bps=1640.00
Time:1297790228 n=11    avg=86.36   stddev=19.05    bps=7600.00
Time:1297790229 n=32    avg=607.97  stddev=635.89   bps=155640.00
Time:1297790230 n=13    avg=582.92  stddev=585.55   bps=60624.00

上述输出一直持续到无穷大。因此,当tcpstat将某些内容输出到stdout时,我想在C程序中处理输出。

谢谢和问候,

Hrishikesh Murali

2 个答案:

答案 0 :(得分:6)

运行tcpstat -i wlan0 -a 1 | your_program并阅读程序中的标准输入。这样壳会照顾管道。

popen库函数和pipe系统调用可用于在较低级别获得相同的结果。您可能也想查看命名管道 - 它们在用户空间中看起来像文件,并且可以以相同的方式进行操作。

答案 1 :(得分:5)

使用tcpstat选项运行-F,这将导致它在每个时间间隔刷新其输出。 (而不是使用stdout的默认块缓冲)

此外,您可能希望使用popensetbuf FILE句柄上明确禁用缓冲,例如

setbuf(popen_fd, NULL);

或者,您可以使用setlinebuf

将其设置为行缓冲
setlinebuf(popen_fd);