强制程序在重定向时刷新其标准输出

Roh*_*nga 10 c linux stdio fifo

我有一个封闭的源程序,打印输出到标准输出.我需要解析输出.所以我使用dup2将输出重定向到fifo(我可以在父进程中读取,分叉和执行二进制文件),然后执行程序.问题是文件中的fprintf调用变为缓冲,因为它现在正在写入文件.

我试着在调用exec之前在stdout上用_IONBF调用setvbuf.但问题仍然存在.

为什么setvbuf在我的情况下没有帮助?

我如何强制输出刷新?

j_r*_*ker 6

setvbuf()没有区别,因为它改变了C运行时库的一部分状态,而不是操作系统的一部分.当新进程开始运行时,它的C运行时库将被重新初始化(即如果它完全使用CRT!)

我听说解决这个问题的唯一方法是以某种方式伪造一个终端进入这个过程.这是因为大多数CRT库默认只执行行缓冲,如果他们认为它们连接到交互式终端(在Unix世界中:if isatty()在文件描述符上返回true),否则它们将缓冲在更大的块中(通常为8Kb左右) ).

这个实用程序看起来是一个非常好的起点.(从对Trick的评论中借用了一个应用程序,认为它的stdin是交互式的,而不是管道,它有其他有用的信息.)