Linux命名管道FIFO的讀寫規則

2021-06-27 09:36:07 字數 2602 閱讀 4513

linux

程式設計(第

3版)》對於

linux

命名管道的讀寫規則詳解的不夠詳細和清楚,查了些資料,在此總結一下:

1.

從fifo

中讀取資料:

約定:如果乙個程序為了從

fifo

中讀取資料而阻塞開啟了

fifo

,那麼稱該程序內的讀操作為設定了阻塞標誌的讀操作。(1

)如果有程序寫開啟

fifo

,且當前

fifo

為空,則對於設定了阻塞標誌的讀操作來說,將一直阻塞下去,直到有資料可以讀時才繼續執行;對於沒有設定阻塞標誌的讀操作來說,則返回

0個位元組,當前

errno

值為eagain

,提醒以後再試。(2

)對於設定了阻塞標誌的讀操作來說,造成阻塞的原因有兩種:一、當前

fifo

內有資料,但有其它程序在讀這些資料;二、

fifo

本身為空。

解阻塞的原因是:

fifo

中有新的資料寫入,不論寫入資料量的大小,也不論讀操作請求多少資料量,只要有資料寫入即可。(3

)讀開啟的阻塞標誌只對本程序第乙個讀操作施加作用,如果本程序中有多個讀操作序列,則在第乙個讀操作被喚醒並完成讀操作後,其它將要執行的讀操作將不再阻塞,即使在執行讀操作時,

fifo

中沒有資料也一樣(此時,讀操作返回0)。

(4)如果沒有程序寫開啟

fifo

,則設定了阻塞標誌的讀操作會阻塞。(5

)如果fifo

中有資料,則設定了阻塞標誌的讀操作不會因為

fifo

中的位元組數少於請求的位元組數而阻塞,此時,讀操作會返回

fifo

中現有的資料量。

2.

從fifo

中寫入資料:

約定:如果乙個程序為了向

fifo

中寫入資料而阻塞開啟

fifo

,那麼稱該程序內的寫操作為設定了阻塞標誌的寫操作。

fifo

的長度是需要考慮的乙個很重要因素。系統對任一時刻在乙個

fifo

中可以存在的資料長度是有限制的。它由

#define pipe_buf

定義,在標頭檔案

limits.h

中。在linux

和許多其他類

unix

系統中,它的值通常是

4096

位元組,red hat fedora9

下是4096

,但在某些系統中它可能會小到

512位元組。

雖然對於只有乙個

fifo

寫程序和乙個

fifo

的讀程序而言,這個限制並不重要,但只使用乙個

fifo

並允許多個不同程序向乙個

fifo

讀程序傳送請求的情況是很常見的。如果幾個不同的程式嘗試同時向

fifo

寫資料,能否保證來自不同程式的資料塊不相互交錯就非常關鍵了

à也就是說,每個寫操作必須「原子化」。

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

(1

)當要寫入的資料量不大於

pipe_buf

時,linux

將保證寫入的原子性。如果此時管道空閒緩衝區不足以容納要寫入的位元組數,則進入睡眠,直到當緩衝區中能夠容納要寫入的位元組數時,才開始進行一次性寫操作。即寫入的資料長度小於等於

pipe_buf

時,那麼或者寫入全部位元組,或者乙個位元組都不寫入,它屬於乙個一次性行為,具體要看

fifo

中是否有足夠的緩衝區。(2

)當要寫入的資料量大於

pipe_buf

時,linux

將不再保證寫入的原子性。

fifo

緩衝區一有空閒區域,寫程序就會試圖向管道寫入資料,寫操作在寫完所有請求寫的資料後返回。

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

(1

)當要寫入的資料量不大於

pipe_buf

時,linux

將保證寫入的原子性。如果當前

fifo

空閒緩衝區能夠容納請求寫入的位元組數,寫完後成功返回;如果當前

fifo

空閒緩衝區不能夠容納請求寫入的位元組數,則返回

eagain

錯誤,提醒以後再寫。(2

)當要寫入的資料量大於

pipe_buf

時,linux

將不再保證寫入的原子性。在寫滿所有

fifo

空閒緩衝區後,寫操作返回。

3.

為了對fifo

讀寫規則驗證:

下面提供了兩個對

fifo

的讀寫程式,適當調節程式中的很少地方或命令列引數就可以對各種

fifo

讀寫規則程序驗證(待續

Linux 命名管道FIFO

管道的乙個不足之處是沒有名字,因此,只能用於具有親緣關係的程序間通訊,在命名管 道 named pipe或fifo 提出後,該限制得到了克服。fifo不同於管道之處在於它提供一 個路徑名與之關聯,以fifo的檔案形式儲存於檔案系統中。命名管道是乙個裝置檔案,因 此,即使程序與建立fifo的程序不存在...

linux命名管道 fifo

除了建立方式,fifo檔案與管道極為相似。fifo是非匿名的管道,通過系統呼叫mkfifo 存在於檔案系統中。函式名稱 int mkfifo const char pathname,mode t mode 標頭檔案函式引數 說明pathname 建立fifo所用的路徑名 mode 指定fifo的屬性...

命名管道(FIFO)

client.c include include include include include define path home chen 7month 7 28 fifo my fifo 這個就是管道的名字,和建立的路徑 int main char buf 1024 while 1 close ...