管道:可分為普通管道和命名管道。普通管道用於有親緣關係的程序間的通訊(父子程序).命名管道,通過給管道命名的方式,使得管道變成檔案系統中的管道檔案,從而允許無親緣關係的程序間通過訪問管道檔案進行通訊。
管道是單向的,一端只能用於輸入,另一端只能用於輸出。管道是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 用於寫管道 通常先建立乙個管道,再通...