我使用CreateProcess
來啓動一個交互式腳本解釋器,並希望透明地將stdin/stdout/stderr從/傳遞給解釋器。如何正確啓動進程並轉發stdin/stdout/stderr?
我第一次嘗試以設置STARTUPINFO
結構傳遞到CreateProcess
像
STARTUPINFOA si = { sizeof(si) };
si.hStdError = ::GetStdHandle(STD_ERROR_HANDLE);
si.hStdOutput = ::GetStdHandle(STD_OUTPUT_HANDLE);
si.hStdInput = ::GetStdHandle(STD_INPUT_HANDLE);
si.dwFlags |= STARTF_USESTDHANDLES;
即我試圖讓腳本解釋器進程使用與我的啓動器進程使用的相同的句柄來讀/寫。這似乎並沒有工作,雖然(我甚至不知道這些標準句柄可以繼承)。
基於Creating a Child Process with Redirected Input and Output示例的第二個想法是設置三個管道來轉發寫入任何管道的所有數據。由於我不知道如何等待數據寫入多個文件(WaitForMultipleObjects
無法在管道上同步),因此我正在考慮設置三個線程,每個線程都會在管道上執行阻塞ReadFile
調用。
我懷疑這可能是矯枉過正,所以我想知道:有沒有更簡單的方法來做到這一點?我不需要對從腳本解釋器傳遞過來的數據進行任何類型的處理。
作爲一個方面說明,在Linux上,我使用execvp
只是用腳本解釋器進程替換當前進程,但在Windows上,我需要啓動腳本解釋器,使主線程處於掛起狀態(以便我可以做一些字節碼修補) - 即使因爲_execvp似乎在Windows上可用,我必須使用CreateProcess。
[Create CreateProcess inherited the calling of the calling process](http://stackoverflow.com/questions/340356/making-createprocess-inherit-the-console-of-the-calling-process) –
Re :如何在多個文件上等待I/O。您爲每個文件句柄創建一個'OVERLAPPED'結構,並帶有一個事件句柄,併發出異步I/O請求(例如'ReadFile'),以傳遞這些'OVERLAPPED'結構。然後等待這些事件句柄。 –
你能否在一個答案中詳細說明@Igor?這似乎是從[以前]的主要區別(http://stackoverflow.com/questions/5485923/launch-an-exe-process-with-stdin-stdout-and-stderr)[問題](http://堆棧溢出。com/questions/340356/making-createprocess-inherit-the-console-of-calling-process)。 – Shog9