我有一个闭源程序,可以将输出打印到标准输出。我需要解析输出。所以我使用 dup2 将输出重定向到 fifo (从中我可以在分叉并执行二进制文件的父进程中读取),然后执行程序。问题是文件中的 fprintf 调用被缓冲,因为它现在正在写入文件。
在调用 exec 之前,我尝试在标准输出上使用 _IONBF 调用 setvbuf 。但问题仍然存在。
为什么 setvbuf 对我的情况没有帮助?
我怎样才能强制刷新输出?
setvbuf()
没有什么区别,因为它改变了 C 运行时库的一部分的状态,而不是操作系统的一部分。当新进程开始运行时,其 C 运行时库将被重新初始化(前提是它完全使用 CRT!)
我听说过的解决这个问题的唯一方法是以某种方式伪造进程的终端。这是因为大多数 CRT 库默认情况下仅执行行缓冲,如果它们认为自己连接到交互式终端(在 Unix 世界中:如果isatty()
在文件描述符上返回 true),否则它们将以更大的块(通常为 8Kb 左右)进行缓冲。
这个实用程序 http://empty.sourceforge.net/看起来是一个很好的起点。 (借用了评论欺骗应用程序认为它的标准输入是交互式的,而不是管道 https://stackoverflow.com/questions/1401002/trick-an-application-into-thinking-its-stdin-is-interactive-not-a-pipe,其中还有其他有用的信息。)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)