2011-10-17 40 views
1

我想創建一個程序,該進程可以爲任何exe文件創建一個進程,同時捕獲該exe文件的stderr和stdout,即重定向到我的程序。目標任意exe文件進程的輸出序列必須保留。即如果它發送10個字符到標準輸出,然後10個字符到標準錯誤,然後10個字符回到標準輸出,我的程序需要識別孩子在stderr和stdout之間交替的事實,而不是簡單地將stderr和stdout視爲2個獨立的流。或者是這樣的:使用StdOut和StdErr重定向創建子進程

標準輸出10個字節標準錯誤10個字節標準輸出10字節標準錯誤3個字節,.........

我知道的標準方法重定向stdout和stderr是創建2個匿名管道,並讓這2個管道由創建的子進程繼承。但問題是匿名管道阻塞I/O。如果我在父項中使用2個線程,一個用於讀取孩子的標準輸出,另一個用於讀取孩子的標準錯誤,我不能說出孩子在標準輸出和標準錯誤之間交替的事實,即上面列出的順序信息丟失。

編輯:

我寫cl.exe時,LIB.EXE和LINK.EXE的代理。與Mozilla的開源項目(NSPR)集合在一起的構建系統使用一些非常獨特的方式來構建的源文件,以使其跨平臺移植和自動檢測目標編譯器(即的autoconf的能力和配置腳本)。它在執行「make」時動態生成一些.h文件和#define。它甚至調用一些python腳本來調用cl.exe。

我不知道Mozilla構建系統正在做什麼,也不知道爲什麼它需要使用一些python腳本來調用cl.exe(顯然分析cl.exe命令的stdout/stderr)。我不想花時間研究它。但我所知道的是它最終必須調用cl.exe,lib.exe和link.exe,並且這些命令的接口必須是命令行參數,env變量和stdout/stderr。所以我需要編寫一個代理cl.exe,它調用真正的cl.exe並提供我自己的命令行參數,並將所有stderr和stdout返回給調用者,儘可能透明。

cl.exe的特點是它可能會在stderr和標準輸出中返回錯誤消息。我只是想要一個透明的方式在真正的cl.exe和構建系統之間插入代理。

回答

1

我不知道你爲什麼要這麼做,但你可以問這樣做:

你必須每個流的線程,兩個線程共享公共隊列或東西,一旦他們讀字節一個流,他們獲得一個鎖並將某種對象放入公共隊列中。即使這樣也不能保證正確性,但我想這樣做會很好。

這種方法會產生巨大的開銷,因爲它會爲每個讀取字節創建對象。根據你所期望的輸出,也許等待整條線會更有意義。

您可能想要擴展您的問題,更具體地說明您要實現的目標?

編輯:爲什麼不直接輸出孩子的標準輸出和標準錯誤到你自己的?

+0

謝謝,看看我的編輯爲什麼我需要這樣的設施 – JavaMan 2011-10-17 16:03:45

相關問題