管道是unix ipc最古老的形式,所有unix系統都提供此通訊機制。
管道的兩種限制:
1 半雙工,資料單方向流動。
2只能用於具有公共祖先的程序之間。需要雙方通訊時,需要建立起兩個管道。
例外:流管道沒有限制1,fifo和命名管道沒有限制2。
管道是乙個檔案,但它不屬於某種檔案系統,而是
單獨構成一種檔案系統,並且只存在與記憶體中。
管道有pipe函式建立:
#includeint pipe(int filedes[2]);
管道是基於檔案描述符的通訊方式。其中filedes[0]為讀開啟,filedes[1]為寫開啟。filedes[1]的輸出是filedes[0]的輸入。如下圖兩種方法描述管道:
通常呼叫fork的程序接著呼叫pipe函式,建立從父程序到子程序或相反的管道。
fork之後管道圖:
現在如果需要父程序到子程序的管道,需要關閉父程序的讀端fd[0]和子程序的寫端fd[1]:
在寫管道時,常數pipe_buf規定了核心中管道快取器的大小。
如果對管道進行write呼叫,而且要求寫的位元組數小於等於pipe_buf,則此操作不會與其他程序對同一管道(或fifo)的write操作穿插進行。
但是,若有多個程序同時寫乙個管道(或fifo),而且某個或某些程序要求寫的位元組數超過pipe_buf位元組數,則資料可能會與其他寫操作的資料相穿插。
當管道的一端被關閉:
(1)寫端關閉,進行讀,在所有資料都被讀取後,read返回0,以指示達到了檔案結束處.
(2)讀端關閉,進行寫,則產生訊號sigpipe。如果忽略該訊號或者捕捉該訊號並從其處理程式返回,則write出錯返回,errno設定為epipe。
下面乙個父程序向子程序傳送字串的例子:
int main(void)
else
}
程序間通訊(IPC) 管道
二 fifo 命名管道 參考管道是一種最基本的ipc機制,作用於有血緣關係的程序之間,完成資料傳遞,呼叫pipe系統函式即可建立乙個管理。有如下性質 1.其本質是乙個偽檔案 實為核心緩衝區 所謂的偽檔案是指不佔磁碟空間大小的檔案,linux的檔案除了 l d,其它的s,b,c,p等都是偽檔案。2.由...
程序間通訊(IPC) 管道(Pipe)
管道 乙個程序連線資料流到另乙個程式 pipe函式的原型 include int pipe int file descriptor 2 該閃身在陣列中填上兩個新的檔案描述符後返回0,如果失敗則返回 1。寫到file descriptor 1 的所有資料都可以從file descriptor 0 讀回...
LINUX程序間通訊(IPC) 管道
管道,通常指無名管道,是unix系統ipc最古老的形式 1 include 標頭檔案 2 int fd 2 fd 0 讀端 fd 1 寫端 3 pipe fd 建立管道 4 傳輸資訊時,傳送端先關閉讀端fd 0 再進行寫操作 接收端反之,close fd 1 read include include...