程序間通訊 管道 命名管道 FIFO

2021-06-29 13:20:10 字數 998 閱讀 2881

比較類似程序間的生產者、消費者模型。乙個程序向管道中寫入資料,另乙個程序從管道中讀出資料。pipe為無名管道,提供的是一組半雙工通訊方式。pipe會建立兩個檔案物件,乙個索引節點。pipe在核心中會有乙個快取,快取大小可能若干個頁大小。呼叫write像管道裡寫資料時,系統會將資料存於快取,另乙個執行緒通過read從快取中取出資料。管道的大小就是快取中尚未被讀取的資料大小。

管道在核心中是作為vfs的物件來實現的,linux 核心中,將pipe在vfs中組織成pipefs,作為一種特殊的檔案系統。pipefs在核心中並沒有系統掛載點,所以使用者是無法找到pipefs。

雖然管道可以進行程序間通訊,但是pipe必須要在有建立關係的程序間才能通訊,無法再任意兩個程序間通訊。命名管道(named pipe)和fifo突破這種限制。它們可以在任意程序間通訊。 fifo和pipe的區別僅在於:

1.fifo的索引節點被掛載到了系統目錄,所以任意執行緒都可以訪問到該節點。

2.fifo是全雙工通訊,可以通過w/r開啟乙個fifo。

為什麼fifo可以被掛載到系統目錄呢?我們一步一步來分析。核心中,fifo是通過c函式mknod()進行建立。而該函式建立的是乙個塊裝置檔案。所以,一旦fifo建立,vfs裡就等於多了乙個塊裝置檔案。於是,自然也就可以掛載到/dev目錄樹中。fifo塊裝置檔案和普通的裝置檔案不同,fifo沒有對應的物理磁碟分割槽。對於普通的塊裝置,vfs在open的時候,會解析塊裝置所在的檔案系統,在建立相關索引節點、目錄項、檔案物件後,呼叫對應檔案系統函式讀取磁碟上對應索引節點的資訊。但是對於fifo,當程序進行讀寫操作時,vfs會找到對應該塊裝置檔案的讀寫操作指標,然後呼叫針對fifo塊裝置檔案的讀寫操作函式,這些函式是由塊裝置驅動函式具體實現。

學習linux核心其實就是在學習各種檔案系統。pipe、fifo包括epoll機制,在linux核心中都是作為特殊檔案系統存在的。epoll在核心中是eventpollfs。

程序間通訊 管道和FIFO

程序間通訊 管道和 fifo 管道,顧名思義就是像水管一樣,水管是用來流通水的,而對與管道來說,做為程序間通訊的一種方式,傳送的是資料而已。對於管道來說,沒有名字,在程式內部以識別符號進行識別,這也就注定了管道只能用於有親緣關係的各個程序間使用。但是這一缺點可以通過 fifo 又程為有名管道來彌補,...

程序間通訊 管道通訊(pipe與fifo)

1.程序間通訊 ipc interprocess communication 程序間通訊常用的4中方式 2.pipe管道 pipe管道為匿名管道,就是乙個偽檔案,是乙個核心緩衝區,不占用磁碟空間。管道由讀端與寫端組成,分別對應兩個檔案描述符,管道的讀寫預設是阻塞的。管道的內部是由環形佇列構成的,具有...

Linux程序間通訊 命名管道fifo

服務端負責讀取管道中資料並將其列印出來 fifo pipe server.c include include include include include include include include include include include define buf len pipe buf...