setvbuf()
没有区别,因为它改变了C运行时库的一部分状态,而不是操作系统的一部分.当新进程开始运行时,它的C运行时库将被重新初始化(即如果它完全使用CRT!)
我听说解决这个问题的唯一方法是以某种方式伪造一个终端进入这个过程.这是因为大多数CRT库默认只执行行缓冲,如果他们认为它们连接到交互式终端(在Unix世界中:if isatty()
在文件描述符上返回true),否则它们将缓冲在更大的块中(通常为8Kb左右) ).
这个实用程序看起来是一个非常好的起点.(从对Trick的评论中借用了一个应用程序,认为它的stdin是交互式的,而不是管道,它有其他有用的信息.)