我有一个封闭的源程序,打印输出到标准输出.我需要解析输出.所以我将输出重定向到fifo(我可以在父进程中读取,分叉和执行二进制文件)使用dup2然后执行程序.问题是文件中的fprintf调用变为缓冲,因为它现在正在写入文件.
我试着在调用exec之前在stdout上用_IONBF调用setvbuf.但问题仍然存在.
为什么setvbuf在我的情况下没有帮助?
我如何强制输出刷新?
解决方法:
setvbuf()没有区别,因为它改变了C运行时库的一部分状态,而不是操作系统的一部分.当新进程开始运行时,它的C运行时库将被重新初始化(即如果它完全使用CRT!)
我听说解决这个问题的唯一方法是以某种方式伪造一个终端进入这个过程.这是因为大多数CRT库默认只执行行缓冲,如果他们认为它们连接到交互式终端(在Unix世界中:if isatty()在文件描述符上返回true),否则它们将缓冲在更大的块中(通常8Kb左右).
This utility看起来是一个非常好的起点. (借鉴了Trick an application into thinking its stdin is interactive, not a pipe的评论,其中有其他有用的信息.)