3 1 程序間通訊之管道

2022-05-04 22:39:12 字數 1583 閱讀 6379

一、引言

管道作用於有血緣關係的程序間的通訊,完成資料傳遞。實際為核心使用環形佇列機制,借助核心緩衝區(4k)實現。有如下特質:

1) 其本質是乙個偽檔案(實為核心緩衝區)

2) 由兩個檔案描述符引用,乙個表示讀端,乙個表示寫端。可定義乙個檔案描述符陣列,訪問。

3) 規定資料從管道的寫端流入管道,從讀端流出。

4) 資料自己讀不能自己寫,資料一旦被讀走,便不在管道中存在,不可反覆讀取。 由於管道採用半雙工通訊方式。因此,資料也只能在乙個方向上流動。

5) 只能在有公共祖先的(血緣關係的)程序間使用管道。

二、pipe函式

呼叫pipe系統函式即可建立乙個管道,其函式原型為:

int pipe(int fd[2

]);成功:

0;失敗:-1,設定errno

向管道檔案讀寫資料其實是在讀寫核心緩衝區,函式引數陣列包含pipe使用的兩個檔案的描述符:fd[0] → r;fd[1] → w,就像0對應標準輸入,1對應標準輸出一樣。注意:在pipe使用時,

無需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 程序控制 有些程序希望完全控制某些程序的執行,...