Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在C程序中使用未完成进程的输出_C_Linux - Fatal编程技术网

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

在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

我在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
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)
在这种情况下,代码可能不会刷新任何内容。