程序間通訊(2) 管道

2021-08-19 03:28:28 字數 2398 閱讀 1376

管道:

本質:核心的快取

管道分類:

管道是程序間通訊中最古老的方式,它是指用於連線乙個讀程序和乙個寫程序以實現他們之間通訊的乙個共享檔案。我們將乙個程序到另乙個程序的資料流,稱之為「管道」 。

它包括匿名管道和命名管道兩種。

匿名管道:

#include

.h>

功能:建立乙個無名管道

原型:int

pipe (int

fd[2]);

引數:fd:檔案描述符陣列,其中fd

[0]表示讀端,fd

[1]表示寫端。

返回值:

成功返回0 ;失敗返回錯誤**。

特點:

1.只用於有親緣關係的程序之間的通訊,通常用於父子程序間的通訊。         

2.必須同時讀寫

3.管道提供流式服務

4.一般而言,程序退出,管道釋放,所以管道的生命週期隨程序

5.一般來說,核心會對管道操作進行同步和互斥

6.管道是半雙工的,資料只能單向流動,需要雙方通訊時,需要建立兩個管道

示例:從鍵盤讀到資料,寫入管道,讀取管道,顯示到螢幕。**實現:

執行結果:

用fork來共享管道原理

**實現:

執行結果:

示例:實現帶管道的命令「ls -l | wc -l」

**實現:

執行結果:

匿名管道讀寫規則:

當管道滿的時候

如果所有管道寫端對應的檔案描述符被關閉,則read返回0

如果所有管道讀端對應的檔案描述符被關閉,則write操作會產生訊號

sigpipe,進而可能導致write程序退出

當要寫入的資料量不大於sig_buf時,linux保證寫入的原子性

當要寫入的資料量大於sig_buf時,linux不再保證寫入的原子性

命名管道:

實現無親緣關係程序之間的通訊,用於執行於同一臺機器上的任意兩個程序間的通訊。

如果我們想在兩個不相關的程序之間交換資料,使用fifo檔案來做這項工作,它就叫做命名管道。

命名管道是一種特殊的檔案。

#include 

功能:建立乙個命名管道

原型:int mkfifo(const

char* filename ,mode_t mode )

返回值:

0表示建立成功

-1表示建立失敗(例如:建立的目錄沒有許可權)

匿名管道和命名管道的區別:1.匿名管道是由pipe函式建立並開啟

2.命名管道由mkfifo函式建立,開啟用open

3.fifo(命名管道)和pipe(匿名管道)之間唯一的區別就是他們的建立方式和開啟方式不同,但一旦這些動作完成之後,他們具有相同的語義

命名管道讀寫規則:

如果當前開啟操作是為寫開啟fifo時

程序間通訊(2) 管道

管道 半雙工通訊 資料流向是單向的 先進先出的。只能乙個程序讀 乙個程序寫。資料從管道中讀出後,就會被刪除。如果管道中沒有資料,讀操作就會被阻塞,直到管道中有資料可讀 而如果管道的滿的,寫操作就會被阻塞,直到管道中有足夠大的空間可用。有名管道 fifo 在任意兩個程序間通訊。有屬性資訊 inode結...

程序間通訊2管道

include include include 1.一般來說子程序和父程序通訊至少需要兩條管道 一條用於讀,一條用於寫 2.兩個程序得共享資源都不是同乙個,一般來說子程序產生得時候會將所有得資源拷貝乙份供子程序使用,所以父程序和子程序得資源不是同乙份 3.如果寫端的管道關閉之後,那麼讀端的就不會阻塞...

程序間通訊(2) 命名管道

命名管道的應用,正是為了克服匿名管道存在的這些缺陷。命名管道可以在沒有親緣關係的程序中應用,甚至在不同計算上的兩個程序也可以通過命名管道實現通訊,這是因為命名管道實際上是windows在網路介面上封裝的程序間通訊形式。命名管道可以實現一對多的通訊,同時也能實現雙向讀寫通訊。結合例子進行講解,例程如下...