一.管道的基本概念
本質:不同的進程可以看到相同的系統資源
進程退出,管道關閉釋放。
管道實現的原理:
創建子進程的時候子進程會繼承父進程的文件描述符表
特點:
(1)只能實現單向通信
(2)適用於有血緣關系的進程(多用於父子進程)
(3)面向字節流的服務
(4)依賴文件系統
(5)匿名管道
管道是由內核管理的一個緩沖區(buffer),相當於我們放入內存中的一個紙條。管道的一端連接一個進程的輸出。這個進程會向管道中放入信息。管道的另一端連接一個進程的輸入,這個進程取出被放入管道的信息。一個緩沖區不需要很大,它被設計成為環形的數據結構,以便管道可以被循環利用。當管道中沒有信息的話,從管道中讀取的進程會等待,直到另一端的進程放入信息。當管道被放滿信息的時候,嘗試放入信息的進程會等待,直到另一端的進程取出信息。當兩個進程都終結的時候,管道也自動消失。
具體的父子進程間管道的實現:
• 限制管道的大小。實際上,管道是一個固定大小的緩沖區。在Linux
中,該緩沖區的大小為1 頁,即4KB,使得它的大小不像文件那樣不加檢驗地增長。使用單個固定緩沖區也會帶來問題,比如在寫管道時可能變滿,當這種情況發生時,隨後對管道的write()調用將默認地被阻塞,等待某些數據被讀取,以便騰出足夠的空間供write()調用寫。
[align=left]• 讀取進程也可能工作得比寫進程快。當所有當前進程數據已被讀取時,管道變空。當這種情況發生時,一個隨後的read()調用將默認地被阻塞,等待某些數據被寫入,這解決了read()調用返回文件結束的問題。[/align]
注意,從管道讀數據是一次性操作,數據一旦被讀,它就從管道中被拋棄,釋放空間以便寫更多的數據。
結論:
1、頁緩沖區大小:4K
2、總緩沖區大小:64K
讀寫規則:
1、<4K的數據立即發送,以頁為單位
2、>4K的數據,將會分成多個頁的數據,分批發送。
最後,附上我寫的一個簡單的管道:
輸出結果: