13.4.15 管道的實現
管道是unix提供的一種在兩個程序間通訊的機制。管道允許乙個程序按照先進先出(first-in-first-out,fifo)的方式向另乙個程序傳送資料。它還可以用於不同程序間的同步。有兩種型別的管道:命名管道和無名管道。就目前的討論而言,可以忽略兩者之間的差別。
從本質上講,管道就是乙個程序向其中寫一些資料,而另乙個程序從中按照寫資料的順序讀這些資料的檔案。因此,管道可以採用普通檔案的形式實現,除了它需要兩個檔案偏移量或rbn之外:乙個用於讀操作,另乙個用於寫操作。管道和普通檔案之間的差別如下:
(1) 管道在ufdt中有兩個條目,在ft中有兩個對應的條目,但在it中只有乙個條目。然而,兩個檔案偏移量是在索引節點中而不是ft條目中按照兩個單獨的字段維護的。這樣做的原因在於:用於管道的系統呼叫同樣被當作普通檔案的系統呼叫。但該方案有乙個潛在的問題:unix提供了可以改變ft中檔案偏移量的用於檔案隨機搜尋的系統呼叫。如果錯誤地將其用於管道,那麼就會改變其中的乙個偏移量,嚴格按照fifo順序寫/讀資料就會很危險,因而嚴重影響管道的實現。一種解決辦法就是從使用者/程式設計師角度,認為管道不同於檔案。這樣會導致採用比較複雜的實現方式。另一種辦法就是在it條目中維護偏移量,而不是在ft條目中。人們更喜歡採用後一種方法。
(2) 對管道檔案而言,預留給它的索引節點只有10個直接塊(0到9)。unix將管道大小限制在10個塊或10 240個位元組。因此,所有塊號都可以放在索引節點自身中。它不使用任何間接塊(索引)。這就是為什麼對管道檔案訪問速度快的原因。
(3) 如果管道滿了,就再次將指標設定到開始的地方,因而形成圓形緩衝區。然而,不能覆蓋任何資料,除非該資料已經被讀出。如果出現這種情況,該程序在喚醒想要從已經滿了的管道中讀取資料的程序後進入睡眠狀態。讀完一些資料後,管道就騰出一些接收新資料的空間。現在,向管道寫資料的程序被喚醒,然後可以向管道寫資料。
(4) 如果程序試圖讀取沒有任何資料的空管道,該程序在喚醒想要寫管道的程序後,它進入睡眠狀態。在寫完一些資料後,最初的程序被喚醒按照寫資料的順序讀取資料。
記住:任何時候,不同程序間可以有多個管道。因此,通常系統將管道作為乙個單獨的檔案系統實現,它有自己的索引節點和空閒資料塊鍊錶。
管道的內部實現
linux管道的實現機制 在linux中,管道是一種使用非常頻繁的通訊機制。從本質上說,管道也是一種檔案,但它又和一般的檔案有所不同,管道可以克服使用檔案進行通訊的兩個問題,具體表現為 限制管道的大小。實際上,管道是乙個固定大小的緩衝區。在linux中,該緩衝區的大小為1頁,即4k位元組,使得它的大...
實現併發的管道
管道客戶端 define crt secure no warnings include include include include define size 4096 char pipename 128 pipe cloudpipe handle m pipe null inta intb voi...
python實現管道
首先,感謝abersheeran 他也是index.py的作者。看了這段 不禁感嘆 天才就是99 的汗水 1 的靈感,但沒有這1 的靈感那99 的汗水也是徒勞 大佬的思路我們還是看看就好,能理解就行了,創造出來還是很有難度的 from functools import partial class f...