天天看點

程序間通信——命名管道

 概念

管道一個不足之處是沒有名字,是以隻能用于具有親緣關系的程序間通信,命名管道(named pipe或FIFO)解決了這一問題。

FIFO提供一個路徑名與之關聯,以FIFO檔案的形式存儲于檔案系統中。檔案系統中路徑名是全局的,各程序都可以通路,是以可以用檔案系統中的路徑名來辨別一個IPC通道。

對檔案系統來說,匿名管道(管道)是不可見的,它的作用僅限于在父程序和子程序兩個程序間進行通信。而命名管道是一個可見的檔案,是以,他可以用于任意兩個程序間進行通信,不管這兩個程序是不是父子程序,也不管這兩個程序之間有沒有關系。

FIFO總是按照先進先出(First Input First Output)的原則工作,第一個被寫入的資料将首先從管道中讀出。

由于Linux中所有的事物都可被視為檔案,是以對命名管道的使用也就變得與檔案操作非常的統一,也使它的使用非常友善,同時我們也可以像平常的檔案名一樣在指令中使用。

建立命名管道

    Linux下有兩種方式建立命名管道。

使用mkfifo指令在Shell下互動地建立一個命名管道。

在程式中使用mkfifo系統調用函數建立命名管道。

程式間通信——命名管道

        pathname是建立的命名管道的全路徑名,mode為建立命名管道的模式,指明它的讀寫權限。成功時傳回0,失敗時傳回-1并建立相應的錯誤碼。

使用命名管道

        命名管道建立後就可以使用了,命名管道和管道的使用方法基本是相同的,隻是使用命名管道時,必須先用open()将它打開。因為命名管道是一個存在于硬碟上的檔案,而管道是存在于記憶體中的特殊檔案。

        需要注意的是,調用open()打開命名管道的程序可能被阻塞,①但如果同時用讀寫方式(O_RDWR)打開,則一定不會導緻阻塞;②如果以隻讀(O_RDONLY)方式打開,則調用open()函數的程序會被阻塞直到有寫方打開管道;③如果以寫方式(O_WRONLY)打開,也會阻塞直到有讀方打開管道。

代碼

FIFO 寫端

程式間通信——命名管道

FIFO 讀端

程式間通信——命名管道

繼續閱讀