Linux 管道 實現程序間通訊

2021-07-31 20:40:22 字數 1194 閱讀 2594

管道是一種最基本的 ipc 機制,由 pipe 函式建立:

#include int pipe(int filedes[2]);
呼叫  pipe  函式時在核心中開闢一塊緩衝區(稱為管道)用於通訊,它有乙個讀端乙個寫端,然後通過  filedes  引數傳出給使用者程式兩個檔案描述符, filedes[0]  指向管道的讀端,filedes[1]  指向管道的寫端。所以管道在使用者程式看起來就像乙個開啟的檔案,通過  read(filedes[0]);  或者  write(filedes[1]);  向這個檔案讀寫資料其實是在讀寫核心緩衝區。pipe 函式呼叫成功返回 0,呼叫失敗返回 -1。

我們編寫乙份管道**如下:

執行結果如下:

可見父子之間實現了程序間通訊。

使用管道需要注意以下4種特殊情況(假設都是阻塞 i/o 操作,沒有設定  o_nonblock  標誌):

1.  如果所有指向管道寫端的檔案描述符都關閉了(管道寫端的引用計數等於0),而仍然有程序從管道的讀端讀資料,那麼管道中剩餘的資料都被讀取後,再次 read 會返回 0,就像讀到檔案末尾一樣。

2.  如果有指向管道寫端的檔案描述符沒關閉(管道寫端的引用計數大於0),而持有管道寫端的程序也沒有向管道中寫資料,這時有程序從管道讀端讀資料,那麼管道中剩餘的資料都被讀取後,再次 read 會阻塞,直到管道中有資料可讀了才讀取資料並返回。

3.  如果所有指向管道讀端的檔案描述符都關閉了(管道讀端的引用計數等於0),這時有程序向管道的寫端 write,那麼該程序會收到訊號 sigpipe,通常會導致程序異常終止。

4.  如果有指向管道讀端的檔案描述符沒關閉(管道讀端的引用計數大於0),而持有管道讀端的程序也沒有從管道中讀資料,這時有程序向管道寫端寫資料,那麼在管道被寫滿時再次 write 會阻塞,直到管道中有空位置了才寫入資料並返回。

Linux 程序間通訊 管道通訊

管道是 單向的 先進先出的,它把乙個程序的輸出和另乙個程序的輸入連線在一起,乙個程序 寫程序 在管道的尾部寫入資料,另乙個程序 讀程序 從管道的頭部讀出資料 資料被乙個程序讀出之後,將被從管道中刪除,其它讀程序將不能再讀到這些資料,管道提供了 簡單的流控制機制,程序試圖讀空管道時,程序將阻塞,同樣,...

linux程序間通訊之管道通訊

一 命名管道通訊 管道通訊分為 無名管道和有名管道 無名管道是用於父子孫程序,之間有血緣關係 有名管道 用於任意兩個程序 無名管道 1 建立 int pipe int filedis 2 它會建立兩個檔案描述符 filedis 0 用於讀管道 filedis 1 用於寫管道 通常先建立乙個管道,再通...

Linux程序間通訊 管道通訊

1.管道簡介 管道是linux中程序間通訊的一種方式,它把乙個程式的輸出直接連線到另乙個程式的輸入。管道主要包括兩種 無名管道和有名管道 無名管道 有名管道 linux中管道通訊的一種原始方法 對無名管道的一種改進 只能用於具有親緣關係的程序之間通訊 可以使互不相關的兩個程序實現彼此通訊 單工的通訊...