Linux中管道的執行原理,檢視計算機管道的容量

2021-07-15 08:39:19 字數 1674 閱讀 8008

管道是linux 支援的最初unix ipc形式之一,具有以下特點:

在linux中,管道是一種使用非常頻繁的通訊機制。從本質上說,管道也是一種檔案,但它又和一般的檔案有所不同,管道可以克服使用檔案進行通訊的兩個問題,具體表現為:

限制管道的大小。實際上,管道是乙個固定大小的緩衝區。在linux中,該緩衝區的大小為1頁,即4k位元組,使得它的大小不象檔案那樣不加檢驗地增長。使用單個固定緩衝區也會帶來問題,比如在寫管道時可能變滿,當這種情況發生時,隨後對管道的write()呼叫將預設地被阻塞,等待某些資料被讀取,以便騰出足夠的空間供write()呼叫寫。

讀取程序也可能工作得比寫程序快。當所有當前程序資料已被讀取時,管道變空。當這種情況發生時,乙個隨後的read()呼叫將預設地被阻塞,等待某些資料被寫入,這解決了read()呼叫返回檔案結束的問題。

注意:從管道讀資料是一次性操作,資料一旦被讀,它就從管道中被拋棄,釋放空間以便寫更多的資料。

實現機制:

管道是由核心管理的乙個緩衝區,相當於我們放入記憶體中的乙個紙條。管道的一端連線乙個程序的輸出。這個程序會向管道中放入資訊。管道的另一端連線乙個程序的輸入,這個程序取出被放入管道的資訊。乙個緩衝區不需要很大,它被設計成為環形的資料結構,以便管道可以被迴圈利用。當管道中沒有資訊的話,從管道中讀取的程序會等待,直到另一端的程序放入資訊。當管道被放滿資訊的時候,嘗試放入資訊的程序會等待,直到另一端的程序取出資訊。當兩個程序都終結的時候,管道也自動消失。

從原理上,管道利用fork機制建立,從而讓兩個程序可以連線到同乙個pipe上。最開始的時候,上面的兩個箭頭都連線在同乙個程序process1上(連線在process1上的兩個箭頭)。當fork複製程序的時候,會將這兩個連線也複製到新的程序(process2)。隨後,每個程序關閉自己不需要的乙個連線 (兩個黃色的箭頭被關閉; process1關閉從pipe來的輸入連線,process2關閉輸出到pipe的連線),這樣,剩下的黑色連線就構成了如上圖的pipe。

實現細節:

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

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

判斷當前計算機管道的容量

讀端不讀,寫端一直寫

Linux中檢視並管理執行的程式

總目錄 linux操作整理 base root sayasora linux ps elf base root sayasora linux ps elf grep python 0 s root 4482 1 5 80 0 14784 poll s aug31 16 16 53 python u ...

Linux 中的管道實現

管道是一種最基本的ipc機制,作用於有血緣關係的程序之間,完成資料傳遞。呼叫pipe系統函式即可建立乙個管道。有如下特質 1.其本質是乙個偽檔案 實為核心緩衝區 2.由兩個檔案描述符引用,乙個表示讀端,乙個表示寫端。3.規定資料從管道的寫端流入管道,從讀端流出。管道的原理 管道實為核心使用環形佇列機...

Linux中管道與管道xrags的區別

工作中,常因為管道 後面加不加xargs問題而出現疑惑,我們要知道為什麼要用xargs呢,linux命令可以從兩個地方讀取要處理的內容,乙個是通過命令列引數,乙個是標準輸入。管道 管道詳解 傳遞字串,文字,文字 管道xrags xargs 字串,文字,文字 檔名 例 首先有乙個ppap的目錄,檢視這...