簡體   English   中英

為什么我的程序在讀取管道的中間凍結?

[英]Why does my program freeze in the middle of a pipe read?

我正在為一個類編寫C ++程序,該程序需要一組N個子進程與基於Unix的系統上的父進程進行通信。 為此,在派生該過程之前,我聲明了兩個由N個管道組成的數組,用於每個通信方向:

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完全相同(我將每個進程將其消息寫入其管道時都將其消息刪除),並且該進程只是停止。 它不會退出,只會停留在該行。 我已經盡力想盡一切辦法弄清楚我發送的消息出了什么問題,但一切都很好。 這里發生了什么?

(很抱歉,如果我的詳細信息不足;我無法弄清楚還必須包括什么內容,以及可以刪除哪些內容以粘貼可以重現該問題的內容。)

預計到達時間:

子進程具有自己的內部while循環,在其中它從自己的管道讀取:

read(pipesToChild[thisProcessNumber][READ_END], charArray, BUF_SIZE);

如果父母已經准備好,它將發送其消息:

write(pipesToParent[thisProcessNumber][WRITE_END], message, BUF_SIZE);

某些修補發現,進程Y與父進程非常相似,一旦正常,就會經歷此循環,然后第二次被卡住。 沖洗到底會做什么,如果我以這種方式寫入/讀取管道,該怎么辦? (如果相關的話,我已經包含了cstdlib,但沒有cstdio。)

在我看來,僵局-您的兩個進程都在等待另一個進程來寫一些東西-但它們實際上都沒有寫任何東西,因此一切都停止了。 確保您的通信設計沒有死鎖(例如,客戶端不斷變紅並僅在讀取READY通信時寫入,而服務器在寫入READ通信后才讀取)。 您可能還考慮使用非阻塞管道。

據我所知,使用pipe()調用創建的管道是無緩沖的-所涉及的唯一緩沖區是管道緩沖區,但是由於這是與完成目標應用程序中讀取操作的緩沖區相同,因此不會產生通信問題。 僅當您將文件描述符映射到類似C的FILE指針時,才發生應用程序級,但事實並非如此。

如果您仍然認為一切正常,請發布可顯示這種行為的最少可編譯代碼,所以我可以說更多。

編輯:

既然您接受了答案,那么如果您還提到哪種解決方案(如果有)可以解決您的問題,那將是很好的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM