Linux 管道是什麼 ?原理

2022-07-02 15:24:10 字數 1886 閱讀 3367

簡單點就是說,乙個命令的結果作為另外乙個命令(結果)的輸入 。

管道是linux提供的一種常見的程序通訊工具,也是很多shell命令能夠靈活組合產生強大用途的乙個重要工具。

管道,顧名思義就是個管子,裡面可以流過去很多東西。舉個栗子ls | morels輸出列出來的檔案目錄就通過『|』這個管道流向了more這個文字瀏覽器。相同的功能我們也可以通過ls > tmp ; tmp > more來完成。實際上管道的功能和第二個方法也很像。管道也是乙個檔案ls的輸出送到這個檔案,more再從這個檔案將東西拿走。  所不同的是管道不同於普通的檔案,是一套特殊的檔案pipefs,在磁碟中沒有映像,只在記憶體中存在,而且只存在於存在親緣關係的程序之間。然後省略若干和檔案系統,linux程序相關的知識…………好吧我還是說兩句吧。

我們知道有句傳說是linux系統中一切皆檔案,事實上這句話很忽悠人,雖然都是檔案乙個文字檔案能和乙個cpu裝置一樣麼。實際上常用的特殊檔案型別就有十多種,之所以要把他們都組織成檔案是為了應用級別的程式設計師程式設計方便,不管操縱什麼東西,檔案、裝置、socket等等都可以open之後read,write再close,可事實上呼叫的底層的系統程式是不一樣的。這個想想也知道,寫乙個文字用的實際操作和往乙個socket寫東西怎麼可能一樣。pipe特殊就在於它是程序通訊的一種方法,這種發法要保證一定的速度,所以就不好扔到硬碟上去讀寫了,乾脆就直接在記憶體上讀寫了,所以它成為乙個檔案只是為了介面的方便。至於說它只在有親緣關係的程序間共享,是因為管道屬於程序開啟的檔案,只有建立管道的程序fork出來的子程序可以共享這個管道的檔案描述符,其他無關係的程序是看不到這個管道的,所以說是一種非常狹隘小資的通訊方式。

管道有兩個口,乙個入水口乙個出水口。pipe系統呼叫會返回兩個檔案描述符,乙個檔案描述符用來寫乙個用來讀。如上圖所示,兩個file結構指向同乙個inode,對應管道在記憶體種所獲得的一片區域。這裡稍微要注意的一點是,儘管我們平時的應用都是乙個管道對應乙個寫程序乙個讀程序,但是管道本身是支援多個程序進行讀寫的,他們只要對相同的描述符進行操作,加之系統的互斥程序就可以實現多程序的通訊。這裡也可以看出管道是半雙工的,沒有乙個檔案描述符可以用來進行讀and寫,如果想在兩程序間進行全雙工操作就開兩條管道吧。

前面說過了,不同的檔案型別的write和read操作是不一樣的,那麼是怎麼通過乙個統一的write和read來找到對應的操作呢?看一下write函式的宣告size_t write(int fd, const void *buf, size_t nbytes),從程序這邊傳過去的唯一乙個可能區分檔案型別的就是這個檔案描述符fd了,也就是通過這個fd檔案系統會找到它到底是哪個檔案,再去採取相應的函式呼叫。當然如果是write操作的話還要涉及到一些對記憶體加鎖的操作。

如果說管道有什麼缺點的話,就是它只能在自家親戚中使用,不利於社會共同富裕,沒有關係的程序就無法通過管道進行勾搭了。於是核心打算採用一種實名制的方式來登記一下管道,這就是fifo。

fifo和pipe用的是同樣的資料結構,同樣的讀寫方式,不同的是核心為他們在磁碟註冊了乙個節點,這樣所有程序都能看到這個硬碟上的節點,只要有許可權就可以操作了,當然內容還是在記憶體中。並且這個實體可以用讀寫模式來開啟,也就可以實現全雙工了。

上面都是一些機制的介紹。其實想寫一下讀原始碼的感受的,只是原始碼的感受過於瑣碎,很難理出乙個頭緒來,而且原始碼的大框架是上面的機制,但看得時候注意到的更多是細節的實現方式,很多東西是和機制無關的。本以為這段的**變更應該不會很大,但是看了一下commit記錄發現變化還是很多的,很多新加的功能是除了注釋找不到相關介紹的,只能自己從**裡推敲。還有一些改進方式是為了彌補以前的缺陷的,看這部分可以提公升一些對系統整體的認識。所以鼓勵大家在看過原理之後還是要看一下**,**中會有很多意外的收穫,而這些收穫又是很難通過別人講述獲得的

到底linux下的管道是什麼?

管道是linux中很重要的一種通訊方式,是把乙個程式的輸出直接連線到另乙個程式的輸入,常說的管道多是指無名管道,無名管道只能用於具有親緣關係的程序之間,這是它與有名管道的最大區別。有名管道叫named pipe或者fifo 先進先出 可以用函式mkfifo 建立。linux管道的實現機制 在linu...

工作原理是什麼 超濾機工作原理是什麼

超濾機即使用超濾技術對水進行淨化處理的裝置。與其它淨水裝置的區別在於它的裝置中使用有超濾膜。其工作原理是採用一種加壓膜分離技術,即在一定的壓力下,使小分子溶質和溶劑穿過一定孔徑的特製的薄膜,而使大分子溶質不能透過,留在膜的一邊,從而使大分子物質得到了部分的純化。超濾根據所加的操作壓力和所用膜的平均孔...

工作原理是什麼 馬桶水箱工作原理是什麼

馬桶水箱工作原理是什麼 它主要是利用排水閥來將裡面的水放出,然後當裡面的水被排完後,水塞便會落下將出水口給堵住。而浮球便會下落將進水閥給拉起,這時水箱就開始注水了,水面在上公升時,浮球也會隨之公升高,當它到達一定高度時,水塞便會將進水口堵住。馬桶選購注意事項 1 挑選馬桶時要注意看它是否屬於哪種陶瓷...