IPC(程序間通訊)之管道詳解

2021-10-07 10:40:53 字數 1683 閱讀 9739

linux和windows中都有

1.管道一次通訊四次資料拷貝:由使用者空間的buf中將資料拷貝到核心中->核心將資料拷貝到記憶體中->記憶體到核心->核心到使用者空間的buf。而共享記憶體則只拷貝兩次資料:使用者空間到記憶體 -> 記憶體到使用者空間。

2.管道用迴圈佇列實現,連續傳送資料可以不限大小。共享記憶體每次傳遞資料大小是固定的;

3.共享記憶體可以隨機訪問,管道只能順序讀寫;

在具有公共祖先的程序之間進行通訊。通訊跟隨程序消亡,所以是只存在於記憶體的臨時檔案。由於這種檔案沒有檔名,不能被非親程序所開啟,只能用於親屬程序間的通訊,所以這種沒有名稱的檔案形成的通訊管道叫做「匿名管道」。

原理:建立子程序會複製父程序包括檔案在內的一些資源。如果父程序建立子程序之前建立了乙個檔案,那麼這個檔案的描述符就會被之後建立的子程序所共享,父、子程序可以通過這個檔案進行通訊。如果通訊的雙方一方只能進行讀操作,而另一方只能進行寫操作,那麼這個檔案就是乙個只能單方向傳送訊息的管道。

實現:程序通過呼叫函式pipe()建立乙個管道。pipe()函式的功能就是建立乙個記憶體檔案,但與建立普通檔案的函式不同,函式pipe()將為程序返回這個檔案的兩個檔案描述符。其中,乙個唯讀屬性的檔案描述符,乙個只寫屬性的檔案描述符,即程序通過fildes[0]只能進行檔案的讀操作,而通過fildes[1]只能進行檔案的寫操作。確定傳輸方向後,一方關閉fildes[0],一方關閉(close())檔案描述符fildes[1],於是管道的連線情況就變成如下情況的單向傳輸管道。

父程序建立管道

父程序建立子程序後,管道也被共享

通訊一方關閉讀,一方關閉寫。方法:close()檔案描述符

侷限性:建立在記憶體中,所以它的容量不可能很大;傳送的是無格式位元組流,要求使用管道的雙方實現必須對傳輸的資料格式進行約定。

在實際檔案系統上真正的檔案,所以它可以在任意程序之間實現通訊。

由於命名管道嚴格遵守先進先出的原則進行傳輸資料,所以這種管道也叫做fifo檔案

由於需要由管道自身來保證通訊程序間的同步,命名管道也是乙個只能單方向訪問的檔案。

原理:也就是說,命名管道提供了乙個路徑名與之關聯,以fifo的檔案形式存在於檔案系統中,在檔案系統中產生乙個物理檔案,其他程序只要訪問該檔案路徑,就能彼此通過管道通訊。在讀資料端以唯讀方式開啟管道檔案,在寫資料端以只寫方式開啟管道檔案。

與普通檔案的區別:

普通檔案無法實現位元組流方式管理,多程序訪問資源衝突;

fifo檔案採用位元組流方式管理,遵循先入先出原則,不涉及共享資源訪問。

操作流程為:mkfifo -> open -> read(write) -> close ->unlink。

程序間通訊 IPC 管道

管道是unix ipc最古老的形式,所有unix系統都提供此通訊機制。管道的兩種限制 1 半雙工,資料單方向流動。2只能用於具有公共祖先的程序之間。需要雙方通訊時,需要建立起兩個管道。例外 流管道沒有限制1,fifo和命名管道沒有限制2。管道是乙個檔案,但它不屬於某種檔案系統,而是 單獨構成一種檔案...

程序間通訊(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 讀回...