程序間通訊 有名管道 無名管道

2021-08-24 17:42:37 字數 1492 閱讀 2669

顧名思義,管道就像是將資料放入到乙個長長的管子中一樣,肯定會有一端寫入資料,稱為寫端,有一段讀出資料,稱為讀端。既然是說像管子一樣那麼它肯定有大小吧,資源不是無窮無盡的,預設下管道的大小是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的管道包括兩種 無名管道和有名管道。特點 只能用於具有親緣關係的程序間通訊 及父子或者兄弟程序 是一種單工的通訊模式,具有固定的讀端和寫端。管道也可以看成一種特殊的檔案進行操作,對於它的讀寫也可以使用普通的...

程序間通訊 無名管道

在上次的部落格中,我給大家介紹了程序間通訊的方式 有名管道。管道分為有名管道和無名管道,那麼此次我將給大家介紹一下另一種管道通訊 無名管道。有名管道是可以應用於任何兩個程序之間資料的單向傳遞,而無名管道是相對於有名管道的,無名管道在使用時產生,不使用後釋放,並不會在系統上留下任何痕跡。無名管道因其使...