程序間通訊的方式 一 管道

2021-12-30 01:58:19 字數 1274 閱讀 9213

管道

(一).通訊方式:

程序間通訊又稱ipc(inter process communication),它可以通過檔案 管道 有名管道 共享記憶體 訊息佇列 訊號量 套接字這幾個方式進行通訊,但是檔案這種以及訊息佇列基本已被淘汰。

所以常用的通訊方式有:

1.管道

2.訊號

3.共享對映區

4.本地套接字

(二).管道基本概念:

而其中的管道機制,是屬於最簡單的一種通訊方式。它適用於有血緣關係的程序之間的單向通訊。它的本質是偽檔案,是一段核心緩衝區。實現原理是核心使用環形佇列,借助核心緩衝區實現。

當我們呼叫pipe()函式建立管道時,需要傳入乙個檔案描述符陣列,乙個表示讀端,乙個表示寫端。就好像乙個管道一樣,寫方程序將資料寫入,讀方再通過管道將資料讀出。既然規定了讀和寫的兩端,以及是環形佇列以及緩衝區實現,就證明了有一定的侷限性。

1.資料不可反覆讀取,即讀了之後在緩衝區中就沒有了

2.半雙工通訊,只能單方向的傳輸資料

3.有血緣關係的程序之間通訊

(三).使用管道進行通訊:

建立管道的函式原型:int pipe(pipefd[2])

所需標頭檔案:#include

引數pipefd[2]會返回兩個檔案描述符,乙個用於讀,另乙個用於寫。預設是fd[0]讀,fd[1]寫。如果建立管道成功,返回0,否則返回-1。

例子:#include

#include

#include

#include

int main()

pid = fork();

if(pid == -1)

else if(pid == 0) //本例子中子程序寫資料

else

write(stdout_fileno, buf, ret); //輸出到終端

}return 0;

}//輸出結果:

hello pipe!(五).注意事項:

在使用管道時,有幾種特殊情況需要注意:

1.管道中沒有資料時,如果管道寫端全部關閉,那麼此時read函式會返回0,如果管道寫端沒有全部關閉,那麼此時read會阻塞等待資料。也就是說,在上面的例子中,如果子程序通過sleep函式睡眠10秒,父程序也會阻塞等待子程序寫資料,因為此時子程序的寫端仍處於開啟狀態。

2.管道讀端全部關閉,程序會異常終止(可以理解為讀資料的都沒有了,那寫資料也沒有意義了)

3.管道已滿時,寫入會阻塞。

要知道管道只能在有血緣關係的程序之間通訊,而有名管道恰可以用於無血緣關係的程序間通訊。

程序間通訊的方式 一 管道

管道 一 通訊方式 程序間通訊又稱ipc inter process communication 它可以通過檔案 管道 有名管道 共享記憶體 訊息佇列 訊號量 套接字這幾個方式進行通訊,但是檔案這種以及訊息佇列基本已被淘汰。所以常用的通訊方式有 1.管道 2.訊號 3.共享對映區 4.本地套接字 二...

程序間通訊(一) 管道

一,用管道進行父子程序通訊 include include define maxline 120 define msginfo hurry up n int main void pid t pid if pipe fd 0 if pid fork 0 if pid 0 father write st...

Linux程序間通訊(一)管道

乙個程序在管道的尾部寫入資料,另乙個程序從管道的頭部讀出資料。管道包括無名管道和有名管道兩種,前者只能用於父程序和子程序間的通訊,後者可用於執行於同一系統中 的任意兩個程序間的通訊。管道通訊 特點 管道通訊是單向的,有固定的讀端和寫端。資料被程序從管道讀出後,在管道中該資料就不存在了。當程序去讀取空...