1. 程式人生 > >Linux程序間通訊二:無名管道

Linux程序間通訊二:無名管道

無名管道相對於有名管道而言,它不存在管道檔案,它實現程序間通訊的一般方式是藉助父子程序共享fork之前開啟的檔案描述符,所以無名管道只能應用於父子程序間通訊。

無名管道有兩種侷限性

  1. 歷史上,無名管道是半雙工通訊的通道,也就是說,一個程序寫的時候,另一個程序只能讀,同時只有一個程序進行讀,也只有一個程序進行寫操作。
  2. 他們只能在具有公共祖先的程序之間使用,也就是我們所說的父子程序。

建立無名管道的系統呼叫如下:

該系統呼叫的引數是一個數組,這個陣列是用來接受該函式返回的兩個檔案描述符,f[0]為讀而開啟,f[1]為寫而開啟,使用f[1]寫進去的資料,就可以使用f[0]讀出來。

要知道,單個程序中管道幾乎沒有任何作用,通常情況下,呼叫pipe接著呼叫fork,這樣就建立了從父程序到子程序或者從子程序到父程序的IPC(程序間通訊)通道。

當無名管道的一段被關閉之後,下列兩條規則會起作用:

  1. 當讀一個寫端已經被關閉的管道時,在所有資料都被讀取後,read返回0,來表示達到了檔案結束處。
  2. 如果寫一個讀端已經被關閉的管道,則會產生一個訊號:SIGPIPE,如果忽略或者捕捉該訊號並從其處理程式返回,則write函式返回-1.

下面我們利用一個例子說明一下:

子程序寫資料,父程序讀資料並輸出每一個字元所對應的ASCII碼。

執行結果如下: