關於管道

管道是進程間通信的方式之一

管道的分類:

           1:匿名管道 :可用於血緣進程間通信 (比如 父子進程)。

           2:命名管道:可用於任意兩個進程間通信。


匿名管道通信:


非親緣進程間利用管道通信:

寫端:

讀端

寫端

讀端

可以通過運行結果看出 兩個無親緣關係的進程通過管道實現了通信。


管道通信中的四種情況:

1. 如果所有指向管道寫端的文件描述符都關閉了(管道寫端的引用計數等於0),而仍然有進程 從管道的讀端讀數據,那麼管道中剩餘的數據都被讀取後,再次read會返回0,就像 讀到文件末尾一樣。 

2. 如果有指向管道寫端的文件描述符沒關閉(管道寫端的引用計數大於0),而持有管道寫 端的 進程也沒有向管道中寫數據,這時有進程從管道讀端讀數據,那麼管道中剩餘的數 據都被讀取後,再次read會阻塞,直到管道中有數據可讀了纔讀取數據並返回。 

3. 如果所有指向管道讀端的文件描述符都關閉了(管道讀端的引用計數等於0),這時有進程向管道的寫端write,那麼該進程會收到信號SIGPIPE,通常會導致進程異常終止。 

4. 如果有指向管道讀端的文件描述符沒關閉(管道讀端的引用計數大於0),而持有管道讀端的 進程也沒有從管道中讀數據,這時有進程向管道寫端寫數據,那麼在管道被寫滿時 再 次write會阻塞,直到管道中有空位置了才寫入數據並返回。 (自己驗證一下) 

發佈了55 篇原創文章 · 獲贊 47 · 訪問量 6萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章