我正在爲需要一組N個子進程與基於Unix系統上的父進程進行通信的類編寫C++程序。爲此,我聲明Ñ管,一個用於每個通信方向的兩個陣列分叉的處理之前:爲什麼我的程序在讀取管道的過程中凍結?
int pipesToParent[N][2];
int pipesToChild[N][2];
... // for int i = 0 to N-1, pipe(pipesToParent[i]), pipe(pipesToChild[i]),
// fork(), yada yada, I included error checking and everything.
int pipesToChild[N][2];
大多數用於父進程的代碼是在while循環;接近這個循環的開始,它從一個特定的進程讀取消息:
read(pipesToParent[processToServe][READ_END], charArray, BUF_SIZE);
它通過循環,從閱讀過程X的消息第一次,它工作正常。然後指示爲進程Y執行相同的操作,該進程的消息包含與進程X完全相同的數據類型(每個進程在將消息寫入其管道時都會收到消息),並且進程停止。它不會退出,它只是在那條線上凍結。我嘗試了所有我能想到的方法來弄清楚我發送的信息可能有什麼問題,但這一切看起來都很好。這裏發生了什麼?
(很抱歉,如果我的細節的不足,我想不出還有什麼我必須包括什麼,我可以刪除貼的東西會重現該問題。)
ETA:
子進程有其自己的內部while循環中,它從自己的管道上寫着:
read(pipesToChild[thisProcessNumber][READ_END], charArray, BUF_SIZE);
如果父母的準備,它會發送其消息:
write(pipesToParent[thisProcessNumber][WRITE_END], message, BUF_SIZE);
有些修補程序已經顯示進程Y很像父進程一次通過這個循環,然後第二次卡住讀取。如果我以這種方式寫入/讀取管道,沖洗會做什麼,我可以這樣做嗎? (如果是相關的,我已經執行#included cstdlib,但不cstdio)
要麼你沒有正確設置你的管道,進程Y實際上沒有寫入數據,或者你有[死鎖](http://en.wikipedia.org/wiki/Deadlock),或者其他事情是錯誤的。沒有更多的代碼很難知道。 –
這可能是由於某種原因Y沒有寫入消息給管道的過程。從管道讀取的進程將阻塞,同時等待數據顯示在管道中。我會確保Y真的寫信給管道。 – BHS
從手冊頁,「請注意輸出popen()流默認情況下是完全緩衝的。」寫完後你會()嗎? –