Linux程序間通訊(匿名管道)

2021-07-28 00:23:19 字數 1558 閱讀 9387

管道

管道是linux中很重要的一種通訊方式,是通過把乙個程式的輸出直接連在另乙個程式的輸入實現通訊的,常說的管道是指匿名管道,它與有名管道之間的最大區別就是只能用於父子程序之間。

管道是一種最基本的ipc機制,由pipe函式建立:

#include

int pipe(int fileds [2]);

呼叫pipe時在核心中開闢一段緩衝區(管道)用於通訊,它有乙個讀端和乙個寫端,然後通過fileds引數傳出給使用者程式兩個檔案描述符,fileds[0]代表讀端,fileds[1]代表寫端。所以管道在使用者程式面前就像開啟乙個檔案,向這個檔案讀寫資料時其實就是在讀寫核心緩衝區。

用pipe函式建立管道成功返回0,建立失敗返回-1。

管道的結構

傳統上有很多種實現管道的方法,如利用

檔案系統

、利用套接字

(sockets)、利用流等。在linux中,使用兩個file

資料結構

來實現管道。這兩個file資料結構中的f_inode(f_dentry)

指標指向同乙個臨時建立的vfs i節點,而該vfs i節點本身又指向記憶體中的乙個物理頁,如圖5.1所示。兩個file資料結構中的f_op指標指向不同的檔案操作例程向量表:乙個用於向管道中寫,另乙個用於從管道中讀。這種實現方法掩蓋了底層實現的差異,從程序的角度來看,讀寫管道的

系統呼叫

和讀寫普通檔案的普通系統呼叫沒什麼不同。當寫程序向管道中寫時,位元組被拷貝到了共享資料頁,當讀程序從管道中讀時,位元組被從共享頁中拷貝出來。linux必須同步對於管道的訪問,必須保證管道的寫和讀步調一致。linux使用鎖、等待佇列和訊號(locks,wait queues and signals)來實現同步。如下圖所示:

管道結構示意圖

管道是如何實現通訊的

1.父程序建立管道,得到兩個檔案描述符指向管道的兩端

2.父程序利用fork函式建立子程序,同樣子程序也有兩個檔案描述符指向管道的兩端

3.父程序關閉fileds[0],子程序關閉fileds[1]。這個時候,父程序可以向管道裡寫,子程序可以往管道裡讀。資料從寫端流入從讀端流出,就實現了通訊。

管道的大小

通過下面的**可以測試管道的容量:

執行結果如下:

可以得到管道容量為65536。

Linux程序間通訊 匿名管道

關於程序間通訊 ipc 每個程序 各自有不同的使用者位址空間 任何乙個程序的全域性變數在另乙個程序中都看不到所以程序之間要交換資料必須通過核心,在核心中開闢一塊緩衝區,程序1把資料從使用者空間拷到核心緩衝區,程序2再從核心緩衝區把資料讀走,核心提供的這種機制稱為程序間通訊 ipc,interproc...

Linux程序間通訊 匿名管道

關於程序間通訊 ipc 每個程序 各自有不同的使用者位址空間 任何乙個程序的全域性變數在另乙個程序中都看不到所以程序之間要交換資料必須通過核心,在核心中開闢一塊緩衝區,程序1把資料從使用者空間拷到核心緩衝區,程序2再從核心緩衝區把資料讀走,核心提供的這種機制稱為程序間通訊 ipc,interproc...

程序間通訊 匿名管道

最近實現乙個遠端超級終端的功能,通訊模式是這樣的 客戶端 通過網路傳送cmd命令到 伺服器端 通過程序間通訊 管道 將此cmd命令發給 cmd.exe程式,cmd.exe執行此cmd命令 接下來 cmd.exe 程式將執行結果返回 伺服器端 傳送此次結果到 客戶端,客戶端對結果進行顯示 其中伺服器端...