1. 程式人生 > >Linux程序間通訊方式一:有名管道FIFO

Linux程序間通訊方式一:有名管道FIFO

有名管道

我們經常把FIFO稱為有名管道(命名管道)。使用它可以實現兩個不相干的程序之間的通訊。它雖然被稱之為檔案,但是管道檔案在磁碟上只有一個inode結點,這個ionde結點指向的是記憶體中的一塊區域,當A程序建立並使用有名管道時,直接把資料寫入記憶體中,而B程序也是直接去記憶體中讀取資料。

FIFO是一種檔案型別,建立FIFO類似於建立檔案,而FIFO的路徑名也的確存在與檔案系統中。在linux作業系統上,我們可以使用mkfifo命令來建立一個FIFO有名管道檔案。並使用它進行兩個不相干程序間的通訊。一旦已經用mkfifo建立了一個管道檔案,那麼一般檔案的I/O函式都可以用於該有名管道檔案(open,close,read,write,等)

可以看到圖中的FIFO檔案,是我們呼叫mkfifo命令創建出來的。

我們使用ll命令看一下它的型別和許可權

從圖中可以看出,FIFO的檔案型別標誌位為p,在Linux系統中,p代表管道檔案型別,許可權方面,組使用者和屬主擁有讀寫許可權,其他使用者擁有隻讀許可權,而這三種使用者都沒有執行許可權。

建立好了一個有名管道之後,我們就可以利用他來進行程序間通訊了,這裡舉一個簡單的例子,a程序往FIFO裡面寫內容,b程序從FIFO裡面讀內容

a.c如下:

b.c如下:

使用者在a程序中輸入一個字串,b程序將其打印出來:執行結果如下:

可以看到,在a程序執行了之後,但是還沒有執行b程序時,a程序不是直接結束,而是阻塞住了,這和我們有名管道執行的機制有關,

當我們開啟一個FIFO時,非阻塞執行標誌(O_NONBLOCK)會產生下列影響:

  1. 在一般情況下(沒有指定O_NONBLOK),只讀方式的呼叫open函式會阻塞到莫格其他程序為寫而開啟該FIFO,也就是說,當我們程序a執行時,沒有同時執行b程序,a程序就會阻塞,直到b程序以寫的方式呼叫open函式開啟這個FIFO,這時我們才能往這個管道檔案裡面寫入資料。
  2. 如果指定了O_NONBLOCK,則只讀open會立即返回,不會阻塞,而要是沒有程序已經為讀開啟一個FIFO,那麼只寫open將出錯返回-1

只有當a,b程序同時執行才會正常執行: