linux程序通訊之管道

2021-06-16 05:24:58 字數 1230 閱讀 6916

管道:可分為普通管道和命名管道。普通管道用於有親緣關係的程序間的通訊(父子程序).命名管道,通過給管道命名的方式,使得管道變成檔案系統中的管道檔案,從而允許無親緣關係的程序間通過訪問管道檔案進行通訊。

管道是單向的,一端只能用於輸入,另一端只能用於輸出。管道是fifo的,即先進先出的,向管道中寫入的資料附加至管道緩衝區的尾部,而讀資料是從管道緩衝區的頭部開始的。普通管道只能用於有親緣關係的程序間的通訊。linux系統下,管道快取區為4096位元組,快取區滿時,阻塞寫操作;快取區空時,阻塞讀操作。

對管道的操作主要有,建立管道,讀寫管道,關閉管道。一般情況下,都是由父程序建立管道,並將該管道傳遞給子程序,這樣父子程序就可以通訊了。

建立管道函式:int pipe(int pipedes[2]);

返回值:0,成功,-1失敗。

pipedes:整形陣列,pipedes[0]用於讀操作,pipedes[1]用於寫操作。

讀寫管道函式:

int read(int fd, char * buf, int bufsize);

int write(int fd, char *buf, int bufsize);

關閉管道函式: int close(int fd); //管道控制代碼

例子:命名管道:命名管道提供了乙個檔名同管道關聯。在管道建立成功後,在檔案系統中將產生乙個物理的fifo檔案。對命名管道的操作,實際上是通過該fifo檔案實現的。命名管道可以用於無親緣關係的程序進行資料交換。

管道建立:

#include

int mkfifo( const char* pathname,  mode_t mode );

返回值:0,成功;-1,失敗

pathname:檔案路徑和檔名。

mode:管道的訪問許可權,與檔案的訪問許可權相同。

對管道的開啟包括兩種方式:阻塞和非阻塞方式。(int open( const char * pathname, int flags);)

當flags為o_nonblock,將以非阻塞的方式開啟。

1、當使用o_nonblock 旗標時,開啟fifo 檔案來讀取的操作會立刻返回,但是若還沒有其他程序開啟fifo 檔案來讀取,則寫入的操作會返回enxio 錯誤**。

2、沒有使用o_nonblock 旗標時,開啟fifo 來讀取的操作會等到其他程序開啟fifo檔案來寫入才正常返回。同樣地,開啟fifo檔案來寫入的操作會等到其他程序開啟fifo檔案來讀取後才正常返回。

例子:

Linux 程序通訊之管道

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

Linux 程序通訊之管道

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

linux程序間通訊之管道通訊

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