顧名思義,管道就像是將資料放入到乙個長長的管子中一樣,肯定會有一端寫入資料,稱為寫端,有一段讀出資料,稱為讀端。既然是說像管子一樣那麼它肯定有大小吧,資源不是無窮無盡的,預設下管道的大小是64k,用ulimit -a 可以檢視。
1、無名管道:
管道是半雙工的,資料只能向乙個方向流動;需要雙方通訊時,需要建立兩個管道
無名管道只能用於父子程序之間(因為父子程序共享開啟的檔案描述符)
無名管道對於管道兩端的程序而言就是乙個檔案,但它不是普通的檔案,它不屬於某種檔案系統,而是自己單獨構成一種檔案系統,並且只存在在核心中。(這也是他無法在沒有親緣關係的程序中使用的原因)
資料的讀出和寫入:乙個程序向管道的一端寫資料,另乙個程序在管道的另一端讀。
無名管道的建立:
int pipe(int pipefd[2]);當乙個管道建立時,它會產生兩個檔案描述符fd[0]和fd[1],分別為讀端和寫端。現在假設fork()建立乙個新程序,父程序負責向管道中寫資料,子程序複製讀資料。那麼父程序要關閉讀端,子程序要關閉寫端。
規則:寫端不存在時,則認為已經讀到資料的尾部,讀函式返回讀到的位元組數為0
寫端存在時,如果寫的位元組數大於pipe_buf(管道預設大小65535,64k)則返回管道現有資料,如果小於pipe_buf,則返回實際大小。
當寫端存在,管道沒有資料時,讀取管道時會阻塞
當讀端存在時,向管道中寫資料才有意義。否則,管道寫端程序會收到核心傳來的sigpipe訊號,使用者程式可以處理該訊號,也可以忽略(預設使應用程式終止)
2、有名管道
有名管道的檔案形式存在於檔案系統中,這樣就可以是任意兩個程序之間通訊。fifo檔案嚴格遵循先進先出的規則,對檔案的讀總是從開始處返回資料,對檔案的寫則把資料加到末尾。都不支援lseek()等檔案定位操作。
注意:有名管道的名字存在與檔案系統中,內容存放在記憶體中。
有名管道的建立:
int mkfifo(const char *pathname ,mode_t mode)
第乙個引數:乙個路徑名,也就是建立後fifo的名字
第二個引數:許可權設定
如果mkfifo的第乙個引數已存在時,返回乙個eexist錯誤。
有名管道比無名管道多乙個開啟操作:open
開啟規則:
(1)如果當前為讀而開啟檔案,若有相應程序為寫開啟了檔案,則當前開啟操作成功返回,否則會阻塞到有程序為寫開啟檔案。
(2)如果當前為寫開啟檔案,若有相應程序為讀開啟了檔案,則當前開啟操作成功返回,否則會阻塞到有程序為開啟檔案。
3、有名管道和無名管道的區別
其實在上面介紹兩者時已經把它們的區別說了最主要的一點是:
無名管道只能在父子程序直接通訊,有名管道可以在任意兩個程序間通訊
無名管道是程序建立管道時存在的,它不存在於檔案系統中,故別的程序無法看到它所以不能和它通訊。有名管道存在於檔案系統中,別的程序可以看到它的檔案描述符,但是它們的內容都是存在記憶體中而非磁碟上。
C 程序間通訊 有名管道,無名管道
1 管道的概念 管道是單向的 先進先出 的,它把乙個程序的輸出和另乙個程序的輸入連線在一起。乙個程序 寫程序 在管道的 尾部寫入 資料,另乙個程序 讀程序 從管道的 頭部讀出 資料。資料被乙個程序讀出後,將被從管道中刪除,其它讀程序將不能再讀到這些資料。管道提供了簡單的流控制機制,程序試圖讀空管道時...
Linux程序間通訊 無名 有名管道
管道是linux中程序間通訊的一種方式,它把乙個程序的輸出直接連線另乙個管道的輸入。linux的管道包括兩種 無名管道和有名管道。特點 只能用於具有親緣關係的程序間通訊 及父子或者兄弟程序 是一種單工的通訊模式,具有固定的讀端和寫端。管道也可以看成一種特殊的檔案進行操作,對於它的讀寫也可以使用普通的...
程序間通訊 無名管道
在上次的部落格中,我給大家介紹了程序間通訊的方式 有名管道。管道分為有名管道和無名管道,那麼此次我將給大家介紹一下另一種管道通訊 無名管道。有名管道是可以應用於任何兩個程序之間資料的單向傳遞,而無名管道是相對於有名管道的,無名管道在使用時產生,不使用後釋放,並不會在系統上留下任何痕跡。無名管道因其使...