在Win32中过滤控制台输出时不需要的缓冲

时间:2010-06-24 18:45:54

标签: winapi process pipe console-application

我的问题与"Turn off buffering in pipe"有关,虽然涉及Windows而不是Unix。

我正在编写一个Make克隆并阻止并行进程对彼此的控制台输出进行颠倒我将输出重定向到管道(如here中所述),我可以在其上进行任何我想要的过滤。不幸的是,长时间运行的进程现在缓冲了它们的输出,而不是像在控制台上那样实时发送它。

从窥视MSVCRT源看,似乎根本原因是GetFileType()用于检查标准I / O句柄是否附加到控制台,然后控制台设置内部标志并最终禁用缓冲。

显然,在创建进程时,还可以通过STARTUPINFO结构的未记录的lpReserved2成员传递单独的可继承文件句柄和标志数组。关于唯一可行的解​​决方案就是使用这个列表,只是在为stdout / stderr设置标志时说谎设备类型。

现在......有没有理智解决这个问题的方法?

1 个答案:

答案 0 :(得分:1)

没有。是的,GetFileType()告诉它stdout不再是char设备,_isatty()返回false,因此CRT将输出流切换到缓冲模式。获得合理的吞吐量很重要。一次刷新输出一个字符只有在人类看到它们时才可以接受。

您必须重新链接您尝试使用自定义版本的CRT重定向的程序。我不怀疑如果可能的话,你首先不会搞砸这个。修补GetFileType()是另一个不太理智的解决方案。