我在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
答案 0 :(得分:6)
运行tcpstat -i wlan0 -a 1 | your_program
并阅读程序中的标准输入。这样壳会照顾管道。
popen
库函数和pipe
系统调用可用于在较低级别获得相同的结果。您可能也想查看命名管道 - 它们在用户空间中看起来像文件,并且可以以相同的方式进行操作。
答案 1 :(得分:5)
使用tcpstat
选项运行-F
,这将导致它在每个时间间隔刷新其输出。 (而不是使用stdout的默认块缓冲)
此外,您可能希望使用popen
在setbuf
FILE句柄上明确禁用缓冲,例如
setbuf(popen_fd, NULL);
或者,您可以使用setlinebuf
setlinebuf(popen_fd);