管道阻塞和FIFO阻塞

2021-09-08 21:38:23 字數 963 閱讀 5488

有名管道的開啟規則

有名管道比管道多了乙個開啟操作:open。

fifo的開啟規則:

如果當前開啟操作是為讀而開啟fifo時,若已經有相應程序為寫而開啟該fifo,則當前開啟操作將成功返回;否則,可能阻塞直到有相應程序為寫而開啟該fifo(當前開啟操作設定了阻塞標誌);或者,成功返回(當前開啟操作沒有設定阻塞標誌)。

如果當前開啟操作是為寫而開啟fifo時,如果已經有相應程序為讀而開啟該fifo,則當前開啟操作將成功返回;否則,可能阻塞直到有相應程序為讀而開啟該fifo(當前開啟操作設定了阻塞標誌);或者,返回enxio錯誤(當前開啟操作沒有設定阻塞標誌)。

注意:

讀取管道開啟時需要等待寫入管道的開啟,同時寫入開啟管道又需要等待讀取管道的開啟

deadlock不會產生,因為這裡「等待」的*不*是另一方的open是否*已經完成*

舉個例子,

如果open fifo時都不指定o_nonblock, a程序首先 open fifo for reading, 它會block.

然後b程序 open fifo for writing, 由於程序a正在open for reading, 因此b的open操作會

立即返回,然後a的open 操作返回。

對開啟規則的驗證參見附2。

2.4有名管道的讀寫規則

從fifo中讀取資料:

約定:如果乙個程序為了從fifo中讀取資料而阻塞開啟fifo,那麼稱該程序內的讀操作為設定了阻塞標誌的讀操作。

注:如果fifo中有資料,則設定了阻塞標誌的讀操作不會因為fifo中的位元組數小於請求讀的位元組數而阻塞,此時,讀操作會返回fifo中現有的資料量。

向fifo中寫入資料:

約定:如果乙個程序為了向fifo中寫入資料而阻塞開啟fifo,那麼稱該程序內的寫操作為設定了阻塞標誌的寫操作。

對於設定了阻塞標誌的寫操作:

對於沒有設定阻塞標誌的寫操作:

Linux有名管道(FIFO)的阻塞和非阻塞讀寫

有名管道的讀寫有阻塞和非阻塞兩種,可以在open 時指定,下面我們對各種情況進行一些討論。寫程序 include include include include include include define fifo name tmp myfifo main 以阻塞型只寫方式開啟fifo fd op...

python 管道 非阻塞 子程序非阻塞從管道讀取

我有乙個程式,需要幾個小時來完成,必須整合到乙個現有的程式。我有乙個指令碼,它通過子程序模組執行程式,這很好地工作。但無法判斷該計畫有多大進展。這個程式確實向stdout輸出一些實時資訊,所以我想我可以從管道中讀取一些資訊。在 但是我不能正確地工作。我的指令碼似乎阻礙了實時從管道中讀取資料。在 我製...

阻塞和非阻塞

在 windows 下的 socket 程式設計有兩個程式設計模型,阻塞和非阻塞。有時,他們也被叫做同步 阻 塞 和非同步 非阻塞 在 unix 中只支援阻塞模型。阻塞 indy 使用阻塞 socket 呼叫。阻塞呼叫很像乙個檔案的讀寫。當你讀資料或者寫資料時,直 到操作完成,函式才會返回。不同的是...