2010-06-24 59 views
1

我的問題與"Turn off buffering in pipe"有關,雖然涉及Windows而不是Unix。在Win32中過濾控制檯輸出時不需要的緩衝

我正在寫一個Make克隆,並停止並行進程衝擊對方的控制檯輸出我已將輸出重定向到管道(如here中所述),我可以在其中進行任何我想要的過濾。不幸的是,長時間運行的流程現在緩衝了他們的輸出,而不是像在控制檯上一樣實時發送它們。

從查看MSVCRT源看來,根本原因在於GetFileType()用於檢查標準I/O句柄是否連接到控制檯,控制檯然後設置內部標誌並結束禁用緩衝。

顯然,一個獨立的可繼承文件句柄和標誌數組也可以通過創建進程時構造的STARTUPINFO結構的未記錄lpReserved2成員傳遞。關於我已經想出的唯一工作解決方案是使用此列表,並在爲stdout/stderr設置標誌時說謊設備類型。

然後......有沒有理智解決這個問題的方法?

回答

1

沒有。是的,GetFileType()告訴它stdout不再是char設備,_isatty()返回false,所以CRT將輸出流切換到緩衝模式。獲得合理的吞吐量很重要。一次沖洗輸出一個字符只有在人看着它時纔可以接受。

您將不得不重新鏈接您嘗試使用CRT的自定義版本重定向的程序。我不懷疑,如果這是可能的,那麼首先你就不會搞砸了。修補GetFileType()是另一個不合理的解決方案。

+0

這樣做不僅可以提高性能,還可以符合標準。 C99,§7.19.3/ 7:「......標準輸入和標準 輸出流被完全緩衝,當且僅當該流可以被確定爲不涉及交互設備時」。 – 2010-06-24 23:05:38