2011-10-12 57 views
0

我正在爲需要一組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)

+0

要麼你沒有正確設置你的管道,進程Y實際上沒有寫入數據,或者你有[死鎖](http://en.wikipedia.org/wiki/Deadlock),或者其他事情是錯誤的。沒有更多的代碼很難知道。 –

+0

這可能是由於某種原因Y沒有寫入消息給管道的過程。從管道讀取的進程將阻塞,同時等待數據顯示在管道中。我會確保Y真的寫信給管道。 – BHS

+1

從手冊頁,「請注意輸出popen()流默認情況下是完全緩衝的。」寫完後你會()嗎? –

回答

1

好像僵局我 - 無論你的進程等待一個又一個 寫的東西 - 但沒有人真正寫什麼,所以一切停止。確保你的通信設計是無死鎖的(例如,客戶一直在閱讀READY通信,並且只能在閱讀READY通信時閱讀)。你也可以考慮去非阻塞管道。

據我所知,使用pipe()調用創建的管道是無緩衝的 - 所涉及的唯一緩衝區是管道緩衝區,但由於這是從目標應用程序中讀取的同一緩衝區,因此無法創建通信問題。應用程序級別僅在將文件描述符映射到類似C的FILE指針時纔會發生,但似乎並非如此。

如果您仍然認爲一切正常,請發佈可顯示此行爲的最小可編譯代碼,以便我可以多說一些。

編輯:

既然你接受了答案,它會如果你還提到其解決方案(如果有的話)來解決你的問題很好。

+0

對不起,我遲遲沒有迴應。原來,我正在閱讀一個ifstream,在某個地方搞砸了其他的東西。我發現了一種不同的方式來檢查程序在那個時候正在做什麼,並解決了問題。 (對不起,如果這是令人困惑。-_-) –

相關問題