日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 综合教程 >内容正文

综合教程

Linux 管道是什么 ?原理

發布時間:2024/8/26 综合教程 29 生活家
生活随笔 收集整理的這篇文章主要介紹了 Linux 管道是什么 ?原理 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

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

管道是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。

FIFO和pipe用的是同樣的數據結構,同樣的讀寫方式,不同的是內核為他們在磁盤注冊了一個節點,這樣所有進程都能看到這個硬盤上的節點,只要有權限就可以操作了,當然內容還是在內存中。并且這個實體可以用讀寫模式來打開,也就可以實現全雙工了。

其他的話

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

總結

以上是生活随笔為你收集整理的Linux 管道是什么 ?原理的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。