2012-08-10 70 views
0

C++在Windows 我創建的cmd.exe的子進程,但是當我在讀我的管道創建子進程

HANDLE parent = GetStdHandle(STD_OUTPUT_HANDLE); 
char buffer[BUFSIZE]; 
DWORD read, written; 
BOOL b = true; 

for(;;) 
{ 
    b = ReadFile(g_hChildStd_OUT_Rd, buffer, BUFSIZE, &read, NULL); 
    if(! b || read == 0) break; 

    b = WriteFile(parent, buffer, read, &written, NULL); 
    if(! b) break; 
} 

它打印從CMD.EXE輸出在我的控制檯就卡住但它掛在這個循環中。 我只需要弄清楚爲什麼它不會破環

+2

你檢查什麼B和閱讀評估,以你讀過的一切(雖然它的無限循環)後?做一點調試,你會找到你的答案。 – Pyrce 2012-08-10 18:46:37

+0

添加更多相關的標籤,也畫主題利弊的關注。這不是嚴格的C++問題(所有這些看起來都像C一樣) - 更多的是Windows API問題。 – metal 2012-08-10 18:48:06

+0

它只是掛在ReadFile的,當管道是空 – birney 2012-08-10 18:49:16

回答

0

你的循環是無限的,因爲b爲總是正確的,因爲ReadFile的和WriteFile總是成功的,你的情況和閱讀永遠不會爲0

+0

有沒有辦法在讀文件上設置超時? – birney 2012-08-10 19:21:33

+0

看看[SetCommTimeouts](http://msdn.microsoft.com/en-us/library/windows/desktop/aa363437%28v=vs.85%29.aspx)函數。 – display101 2012-08-10 19:39:47

+0

@Keith:SetCommTimeouts,根據該文檔,是用於串行端口,而不是爲管道。 – 2012-08-10 21:43:18

1

你的代碼在管道的寫入結束關閉時寫入應該退出,當最後一個句柄關閉時發生。如果子進程退出,則其管道寫入結束的句柄將自動關閉。

你沒有足夠的代碼讓我確定,但最可能的原因是你沒有關閉你的句柄到管道的寫入結束。如果你在啓動子進程後關閉句柄,你的代碼應該工作。