Linux下管道的實現機制

2021-08-01 17:25:15 字數 1626 閱讀 1400

檢視linux下管道的預設大小可以使用命令ulimit -a

儘管命令ulimit -a看到管道大小8塊,緩衝區的大小不是4 k,因為核心動態分配最大16「緩衝條目」,乘64 k

驗證管道的容量:

管道是一種最基本的 ipc機制,由pipe函式建立: 呼叫pipe函式時在核心中開闢⼀一塊緩衝區(稱為管道)用於通訊,它有⼀個讀端乙個寫端,然後通 過filedes引數傳出給使用者程式兩個⽂檔案描述符,filedes[0]指向管道的讀端,filedes[1]指向管道的 寫端(很好記,就像0是標準輸⼊入1是標準輸出⼀一樣)。所以管道在⽤使用者程式看起來就像⼀個開啟 的檔案,通過read(filedes[0]);或者write(filedes[1]);向這個⽂檔案讀寫資料其實是在讀寫核心緩衝 區。pipe函式調⽤用成功返回0,調⽤用失敗返回-1。 從管道讀資料是一次性操作,資料一旦被讀,它就從管道中被拋棄,釋放空間以便寫更多的資料。

管道是有預設大小的,如果我們一直往這個緩衝區裡一直寫而不讀取資料,那麼到達了管道最大的容量就無法繼續往裡面寫資料。通過這種方式來驗證管道的容量

fcntl函式根據檔案描述符來操作檔案的特性

fcntl(pipefd[1], f_setfl, flags | o_nonblock); // 設定為非阻塞

· f_getfl:獲取fd的檔案狀態標誌

f_setfl:設定檔案描述符的狀態標誌

o_nonblock,如果read或者write沒有可操作的資料則會返回-1或者錯誤

#include

#include

#include

#include

#include

#include

#include

#include

int main(int argc, char *argv)

count++;

} printf("count=%d\n", count); //管道容量

在linux下管道並沒有專門的資料結構,而是借助了檔案系統的file結構和vfs的索引節點inode。通過將兩個 file 結構指向同乙個臨時的vfs 索引節點,而這個 vfs 索引節點又指向乙個物理頁面而實現的。有點類似於頁表的對映機制。

有兩個 file 資料結構,但它們定義檔案操作例程位址是不同的,其中乙個是向管道中寫入資料的例程位址,而另乙個是從管道中讀出資料的例程位址。這樣,使用者程式的系統呼叫仍然是通常的檔案操作,而核心卻利用這種抽象機制實現了管道這一特殊操作。

管道的讀寫

管道寫函式通過將位元組複製到 vfs 索引節點指向的物理記憶體而寫入資料,而管道讀函式則通過複製物理記憶體中的位元組而讀出資料。

在對管道進行寫操作的時候必須滿足:記憶體中有足夠的空間來容納要寫的資料,此時寫資料的時候不允許來讀。

因此管道是自帶同步與互斥機制的,通過檔案描述符往裡寫資料的時候不允許此時讀資料,通過檔案描述符往外拿資料的時候不允許此時寫資料。這是為了解決資料的二義性問題。

linux下管道的容量以及實現機制

一 管道外部實現 當我們定義乙個管道時,這個管道 是由核心管理的乙個緩衝區,可以抽象為現實生活中的乙個傳輸線路。管道的一端連線乙個程序的輸出,這個程序會向管道中放入資訊。管道的另一端連線乙個程序的輸入,這個程序取出被放入管道的資訊。當管道中沒有資訊的話,從管道中讀取的程序會等待,直到另一端的程序放入...

linux下管道的容量以及實現機制

一 管道外部實現 當我們定義乙個管道時,這個管道是由核心管理的乙個緩衝區,可以抽象為現實生活中的乙個傳輸線路。管道的一端連線乙個程序的輸出,這個程序會向管道中放入資訊。管道的另一端連線乙個程序的輸入,這個程序取出被放入管道的資訊。當管道中沒有資訊的話,從管道中讀取的程序會等待,直到另一端的程序放入資...

linux下管道命令

想必很多剛接觸linux尤其是在redhat環境下,大家都見過 rpm qa grep 或者rpm qa sort之類的命令,但是並不知道 是乙個什麼符號。管道符號,是unix功能強大的乙個地方,符號是一條豎線 用法 command 1 command 2 他的功能是把第乙個命令command 1執...