我在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
Run Code Online (Sandbox Code Playgroud)
上面的输出一直持续到无穷大.因此,当tcpstat将某些内容输出到stdout时,我想在C程序中处理输出.
感谢致敬,
Hrishikesh Murali
运行tcpstat -i wlan0 -a 1 | your_program并读取程序中的标准输入.这样壳会照顾管道.
的popen库函数和pipe系统调用可用于在较低的水平,以达到相同的结果.您可能也想查看命名管道 - 它们看起来像用户空间中的文件,并且可以以相同的方式进行操作.
tcpstat使用该-F选项运行,这将导致它在每个间隔刷新其输出.(而不是使用stdout的默认块缓冲)
此外,您可能希望popen使用setbuf,例如,在FILE句柄上显式禁用缓冲.
setbuf(popen_fd, NULL);
Run Code Online (Sandbox Code Playgroud)
或者,您可以使用它将其设置为行缓冲 setlinebuf
setlinebuf(popen_fd);
Run Code Online (Sandbox Code Playgroud)