進程間通信--管道、命名管道、FIFO

無名管道、有名管道(FIFO)

比較類似進程間的生產者、消費者模型。一個進程向管道中寫入數據,另一個進程從管道中讀出數據。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。

這裏寫圖片描述

發佈了17 篇原創文章 · 獲贊 10 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章