一、引言
管道作用於有血緣關係的程序間的通訊,完成資料傳遞。實際為核心使用環形佇列機制,借助核心緩衝區(4k)實現。有如下特質:
1) 其本質是乙個偽檔案(實為核心緩衝區)
2) 由兩個檔案描述符引用,乙個表示讀端,乙個表示寫端。可定義乙個檔案描述符陣列,訪問。
3) 規定資料從管道的寫端流入管道,從讀端流出。
4) 資料自己讀不能自己寫,資料一旦被讀走,便不在管道中存在,不可反覆讀取。 由於管道採用半雙工通訊方式。因此,資料也只能在乙個方向上流動。
5) 只能在有公共祖先的(血緣關係的)程序間使用管道。
二、pipe函式
呼叫pipe系統函式即可建立乙個管道,其函式原型為:
int pipe(int fd[2向管道檔案讀寫資料其實是在讀寫核心緩衝區,函式引數陣列包含pipe使用的兩個檔案的描述符:fd[0] → r;fd[1] → w,就像0對應標準輸入,1對應標準輸出一樣。注意:在pipe使用時,]);成功:
0;失敗:-1,設定errno
無需open,但需手動close。
管道方法通訊流程:
1) 父程序呼叫pipe函式建立管道,得到兩個檔案描述符fd[0]、fd[1]指向管道的讀端和寫端。
2) 父程序呼叫fork建立子程序,那麼子程序也有兩個檔案描述符指向同一管道。
3) 父程序關閉管道讀端,子程序關閉管道寫端。父程序可以向管道中寫入資料,子程序將管道中的資料讀出。由於管道是利用環形佇列實現的,資料從寫端流入管道,從讀端流出,這樣就實現了程序間通訊。
三、例程
1 #include 2 #include編譯執行結果:3 #include 4 #include 5 #include 6
7int main(void)8
22else
if (pid == 0
) 28
else
3435
return0;
36 }
補充:
讀管道:
1)管道中有資料,read返回實際讀到的位元組數。
2)管道中無資料:
(1) 管道寫端被全部關閉,read返回0 (好像讀到檔案結尾)
(2) 寫端沒有全部被關閉,read阻塞等待(不久的將來可能有資料遞達,此時會讓出cpu)
寫管道:
1)管道讀端全部被關閉, 程序異常終止(也可使用捕捉sigpipe訊號,使程序不終止)
2)管道讀端沒有全部關閉:
(1) 管道已滿,write阻塞。
(2) 管道未滿,write將資料寫入,並返回實際寫入的位元組數。
緩衝大小:使用ulimit –a 命令來檢視當前系統中建立管道檔案所對應的核心緩衝區大小
程序間通訊 之 管道
一 無名管道 特點 具有親緣關係的程序間通訊,但不僅僅指父子程序之間哦。1 無名管道的建立 int pipe int pipefd 引數 pipefd 陣列的首位址 返回值 成功返回0,失敗返回 1 注意 無名管道存在核心空間,建立成功會給使用者空間兩個檔案描述符,fd 0 讀管道 fd 1 寫管道...
程序間通訊之管道
我們將乙個程序到另乙個程序的資料流稱為管道,它是程序間通訊最古老的方式。管道分為兩種 匿名管道與命名管道。匿名管道 顧名思義,所謂的匿名管道自然就是沒有名字的管道,這種管道通常用於有親緣關係的程序間的通訊。匿名管道通常由pipe函式來建立,當乙個程序建立了乙個匿名管道後,它們的模型就是這樣的 可以看...
程序間通訊之管道
既然要介紹程序間通訊,首先來看看什麼是程序間通訊 2.程序間通訊的目的 1 資料傳輸 乙個程序需要將它的資料傳送給另乙個人程序 2 資源共享 多個程序共享同樣的資源 3 通知事件 乙個程序需要向另乙個或一組程序傳送訊息,通知它 它們 發生了某種事件 4 程序控制 有些程序希望完全控制某些程序的執行,...