在C程序中使用未完成进程的输出
我在linux环境中使用。我想在C程序中捕获它的输出,即使它还没有完成。我尝试使用popen()函数,但它只能在程序完成后处理输出。我想动态处理tcpstat的输出,当它在标准输出上打印时。我该怎么做 比如说,在C程序中使用未完成进程的输出,c,linux,C,Linux,我在linux环境中使用。我想在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
$ 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运行您的| u程序中的标准输入。这样,壳体将负责管道
可以使用
popen
库函数和pipe
系统调用在较低级别上实现相同的结果。您可能还想查看命名管道-它们在用户空间中看起来像文件,可以以相同的方式进行操作。使用-F
选项运行tcpstat
,这将导致它在每个间隔刷新其输出。(而不是对标准输出使用默认块缓冲)
此外,您可能希望使用setbuf
显式禁用popen
文件句柄上的缓冲,例如
setbuf(popen_fd, NULL);
或者,您可以使用setlinebuf
setlinebuf(popen_fd);
但是当我执行popen()和fread()时,fread直到popen执行的命令完成才执行。由于该命令将永远运行,因此存在一个问题。你关于使用管道的建议很好,但我想让我的程序独立于shell。此外,程序只是不执行这一个命令。在一个程序中有多个线程执行类似的命令,每个线程必须独立地读取tcpstat的输出。所以我想管道是不够的。另外,您认为如何使用popen库函数实现管道的功能?我想您应该可以使用
popen
,只确保其他进程定期刷新其输出,正如我在对Hasturkun回答的评论中指出的那样,+1:问题真的可能是tcpstat进程没有定期刷新其输出。谢谢,我会记住这一点:-)有没有办法使用popen?我在同一个程序中使用多个线程,它们独立地使用tcpstat,并且必须独立地处理输出。所以管道在那里不起作用,是吗?@Hrishikesh:你应该可以使用popen
来完成这项工作。顺便说一句,我不能完全确定-F
标志是否有效,tcpstat代码似乎是使用write
输出的,而不是fwrite
,因此首先不应该缓冲。@Hasturkun:除了C库缓冲外,操作系统也缓冲。@wnoise:可能是这样,但是fflush(NULL)
在这种情况下,代码可能不会刷新任何内容。