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