一尘不染

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

linux

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

我尝试在调用exec之前在sdout上使用_IONBF调用setvbuf。但是问题仍然存在。

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

我如何强制输出被冲洗?


阅读 390

收藏
2020-06-02

共1个答案

一尘不染

setvbuf()没什么区别,因为它更改了C运行时库而不是OS的一部分的状态。当新进程开始运行时,它将重新初始化其C运行时库(也就是说,如果它完全使用CRT!)

我所知解决此问题的唯一方法是以某种方式伪造该过程的终端。这是因为大多数CRT库在默认情况下仅在相信连接到交互式终端的情况下才执行行缓冲(在Unix世界中:如果isatty()在文件描述符上返回true),否则它们将在更大的块中缓冲(通常为8Kb左右)
)。

该实用程序看起来像是一个很好的起点。

2020-06-02