我有一个封闭的源程序,可以将输出打印到标准输出。我需要解析输出。因此,我使用dup2将输出重定向到FIFO(可以在分叉并执行二进制文件的父进程中从中读取),然后执行该程序。问题是文件中的fprintf调用被缓冲了,因为它现在正在写入文件。
我尝试在调用exec之前在sdout上使用_IONBF调用setvbuf。但是问题仍然存在。
为什么setvbuf对我的情况没有帮助?
我如何强制输出被冲洗?
setvbuf()没什么区别,因为它更改了C运行时库而不是OS的一部分的状态。当新进程开始运行时,它将重新初始化其C运行时库(也就是说,如果它完全使用CRT!)
setvbuf()
我所知解决此问题的唯一方法是以某种方式伪造该过程的终端。这是因为大多数CRT库在默认情况下仅在相信连接到交互式终端的情况下才执行行缓冲(在Unix世界中:如果isatty()在文件描述符上返回true),否则它们将在更大的块中缓冲(通常为8Kb左右) )。
isatty()
该实用程序看起来像是一个很好的起点。