实时获取另一个程序的输出作为输入
我有两个程序,使用方式是这样的:
$ c_program | python_program.py
c_program 用 printf()
打印一些内容,而 python_program.py 则用 sys.stdin.readline()
来读取这些内容。
我想让 python_program.py 能够在 c_program 打印的时候,立刻处理 c_program 的输出,这样它就可以及时打印自己的输出。不幸的是,python_program.py 只能在 c_program 结束后才能获取输入。
我该怎么解决这个问题呢?
6 个回答
9
你需要在你的C程序中,每输出一行后都调用一下fflush(stdout)。比如,使用GNU的grep工具时,可以加上'--line-buffered'这个选项,这样就会实现这个效果。想了解更多,可以看看fflush的相关内容。
18
在你的C程序开始时(在进行任何输出之前),只需将标准输出设置为行缓冲,像这样:
#include <stdio.h>
setvbuf(stdout, NULL, _IOLBF, 0);
或者
#include <stdio.h>
setlinebuf(stdout);
这两种方法在Linux上都可以用,但setvbuf
是C语言标准的一部分,所以它在更多系统上都能使用。
默认情况下,标准输出在管道或文件中是块缓冲,而在终端中是行缓冲。因为在这种情况下标准输出是一个管道,所以默认是块缓冲。如果是块缓冲,当缓冲区满了或者你调用fflush(stdout)
时,缓冲区的内容才会被输出。如果是行缓冲,那么每输出一行就会自动刷新缓冲区。