Unix管道與命名FIFO

2021-06-20 21:09:35 字數 1091 閱讀 2141

事實上,管道與fifo是不同的;

管道是pipe,基本上pipe()完就可以用了;

fifo需要先mkfifo,然後再open;

如果mkfifo發現fifo已存在,那麼說明已建立過,此時open;

pipe沒有名字,只能在親緣程序裡使用。當然,技術上講,可以傳遞描述符後,非親緣也可以用。但比較麻煩;

fifo在mkfifo的時候指明了路徑(名字);

當然,兩者又有些相同;

都是半雙工的;(當然,有些系統也支援全雙工的pipe);

關於fifo;

由於要open,所以open時很講究;

因為如果你open乙個fifo來唯讀,但如果另一頭沒有人open來寫,你就會阻塞;

同樣,如果你open乙個fifo來寫,但如果另一頭沒有人open來讀,你就會阻塞;

所以,如果你要靠兩個fifo來實現「全雙工」,那麼,合理的做法是(約定)大家一同open同乙個fifo,並且一邊是以唯讀方式開啟,一邊是只寫方式開啟;否則,大家都一起死鎖;

pipe:

管道因為沒有open,所以沒有這個問題。

另外,fifo如果要刪掉,需要大家呼叫unlink。

當然,兩者還有相同;

兩者在讀寫時都會面臨阻塞的問題,可以通過nonblock來設定為非阻塞。

fifo有兩者設定的方法:(1)open的時候設定。顯然,這種方法pipe沒有;(2)fcntl來設定。

必須注意,設定時不能直接設定,必須取得當前的狀態然後進行「或」運算,否則會取消當前的狀態,僅設定為nonblock。

int flags;

flags=fcntl(fd, f_getfl, 0);

flags |= o_nonblock;

fcntl(fd, f_setfl, flags);

還有,很關鍵的,管道與fifo,都是程序持續性。也就是說,管道與fifo的有效性,是隨著開啟它的最後乙個程序關閉了,才會失效的;它的資料,是由核心在維護的。fifo雖然在建立時依附於乙個檔案,但事實上,維護資料的是核心,即便有一方關閉了fifo,只要還有乙個程序開啟著它,資料依然存在。事實上,即便刪除了fifo檔案,仍然是可以往裡面讀或寫資料的。

哎喲,先到這吧。return。

UNIX命名管道FIFO

fifo,又稱命名管道,是linux下 unix環境下 一種程序間通訊的機制,應用廣泛。函式mkfifo用於建立命名管道,使用命令man 3 mkfifo可檢視此函式資訊。fifo建立後,可以像普通檔案一樣對其訪問。執行命令 mkfifo tmp fifo cat tmp 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 ...

命名管道 FIFO

解決了無關程序不能使用管道通訊的問題。pipe是線性的,乙個pipe只能有乙個輸入輸出,fifo是非線性的,乙個fifo可以有多個輸入或輸出。fifo的用途 1 shell命令使用fifo將資料從一條管道傳送到另一條時,無需建立中間臨時檔案。2 客戶程序 伺服器程序應用程式中,fifo用作匯聚點,在...