linux之程序通訊學習 管道

2021-08-20 09:41:41 字數 1542 閱讀 9271

參閱:

1.管道簡述

管道是用於連線乙個讀程序和乙個寫程序,以實現它們之間通訊的共享檔案,稱pipe 檔案。向管道(共享檔案)提供輸入的傳送程序(即寫程序),以字元流形式將大量的資料送入管道;而接收管道輸出的接收程序(即讀程序),可從管道中接收資料。

即管道讀函式pipe_read()和管道寫函式pipe_wrtie();

2.管道的特點

• 互斥  乙個程序正在對pipe 進行讀/寫操作時,另乙個程序必須等待。

• 同步  當寫(輸入)程序把一定數量(如4kb)資料寫入pipe 後,便去睡眠等待,直到讀(輸出)程序取走資料後,再把它喚  醒。當讀程序讀到一空pipe 時,也應睡眠等待,直至寫程序將資料寫入管道後,才將它喚醒。

• 對方是否存在。只有確定對方已存在時,才能進行通訊。

• 限制管道的大小。實際上,管道是乙個固定大小的緩衝區。該緩衝區大小為1 頁,即4kb,用滿後,隨後對管道的write()呼叫將 預設地被據被阻塞,等待某些資料被讀取,以騰出足夠的空間write()呼叫。

• 讀取程序也可能工作得比寫程序快。當所有當前程序資料已被讀取時,管道變空。這種情況發生時,乙個隨後的read()呼叫將預設地被阻塞,等待某些資料被寫入,這解決了read()呼叫返回檔案結束的問題。

注意,從管道讀資料是一次性操作,資料一旦被讀,它就從管道中被拋棄,釋放空間以便寫更多的資料。

3.實現過程

4.**實現

通過pipe()函式建立管道。pipe()的引數是指向兩個元素的整型陣列的指標,它將由呼叫兩個所要求的檔案描述符填入。

#include 

int pipe(int fd[2]);

fd[0]指向管道的讀端,fd[1]指向管道的寫端。

返回值:成功返回1,失敗返回-1

注意:在pipe的引數中,沒有路徑名,這表明,建立管道並不象建立檔案一樣,要為它建立乙個目錄連線。這樣做的好處是,其它現存的程序無法得到該管道的檔案描述符,從而不能訪問它。那麼兩個程序如何使用乙個管道來通訊呢?

答:fork()

和exec()系統呼叫可以保證檔案描述符的複製品既可供雙親程序使用,也可供它的子女程序使用。

這裡更明確的含義是:乙個普通的管道僅可供具有共同祖先(已經建立了供它們使用的管道)的兩個程序之間共享,。

linux程序通訊之管道

管道 可分為普通管道和命名管道。普通管道用於有親緣關係的程序間的通訊 父子程序 命名管道,通過給管道命名的方式,使得管道變成檔案系統中的管道檔案,從而允許無親緣關係的程序間通過訪問管道檔案進行通訊。管道是單向的,一端只能用於輸入,另一端只能用於輸出。管道是fifo的,即先進先出的,向管道中寫入的資料...

Linux 程序通訊之管道

管道是單向的 先進先出的,它把乙個程序的輸出和另乙個程序的輸入連線在一起。乙個程序 寫程序 在管道的尾部寫入資料,另乙個程序 讀程序 從管道的頭部讀出資料。資料被乙個程序讀出後,將被從管道中刪除,其他讀程序將不能再讀到這些資料。管道提供了簡單的流控制機制,程序試圖讀空管道時,程序將阻塞。同樣,管道已...

Linux 程序通訊之管道

管道是單向的 先進先出的,它把乙個程序的輸出和還有乙個程序的輸入連線在一起。乙個程序 寫程序 在管道的尾部寫入資料,還有乙個程序 讀程序 從管道的頭部讀出資料。資料被乙個程序讀出後,將被從管道中刪除,其它讀程序將不能再讀到這些資料。管道提供了簡單的流控制機制,程序試圖讀空管道時,程序將堵塞。相同,管...