概念
管道一個不足之處是沒有名字,是以隻能用于具有親緣關系的程序間通信,命名管道(named pipe或FIFO)解決了這一問題。
FIFO提供一個路徑名與之關聯,以FIFO檔案的形式存儲于檔案系統中。檔案系統中路徑名是全局的,各程序都可以通路,是以可以用檔案系統中的路徑名來辨別一個IPC通道。
對檔案系統來說,匿名管道(管道)是不可見的,它的作用僅限于在父程序和子程序兩個程序間進行通信。而命名管道是一個可見的檔案,是以,他可以用于任意兩個程序間進行通信,不管這兩個程序是不是父子程序,也不管這兩個程序之間有沒有關系。
FIFO總是按照先進先出(First Input First Output)的原則工作,第一個被寫入的資料将首先從管道中讀出。
由于Linux中所有的事物都可被視為檔案,是以對命名管道的使用也就變得與檔案操作非常的統一,也使它的使用非常友善,同時我們也可以像平常的檔案名一樣在指令中使用。
建立命名管道
Linux下有兩種方式建立命名管道。
使用mkfifo指令在Shell下互動地建立一個命名管道。
在程式中使用mkfifo系統調用函數建立命名管道。
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiIn5GcukzNy00cMRjTXZ1dBFUQkRkSyFVZUFmUmFTbvl2S39CX2AzLcdDOvwFMw00LcJDMzZWe39CXt92Yu8GdjFTNukzcvw1LcpDc0RHaiojIsJye.png)
pathname是建立的命名管道的全路徑名,mode為建立命名管道的模式,指明它的讀寫權限。成功時傳回0,失敗時傳回-1并建立相應的錯誤碼。
使用命名管道
命名管道建立後就可以使用了,命名管道和管道的使用方法基本是相同的,隻是使用命名管道時,必須先用open()将它打開。因為命名管道是一個存在于硬碟上的檔案,而管道是存在于記憶體中的特殊檔案。
需要注意的是,調用open()打開命名管道的程序可能被阻塞,①但如果同時用讀寫方式(O_RDWR)打開,則一定不會導緻阻塞;②如果以隻讀(O_RDONLY)方式打開,則調用open()函數的程序會被阻塞直到有寫方打開管道;③如果以寫方式(O_WRONLY)打開,也會阻塞直到有讀方打開管道。
代碼
FIFO 寫端
FIFO 讀端