使用管道需要注意以下4種特殊情況(假設都是阻塞i/o操作,沒有設定o_nonblock
標誌):
如果所有指向管道寫端的檔案描述符都關閉了(管道寫端的引用計數等於0),而仍然有程序從管道的讀端讀資料,那麼管道中剩餘的資料都被讀取後,再次read
會返回0,就像讀到檔案末尾一樣。
如果有指向管道寫端的檔案描述符沒關閉(管道寫端的引用計數大於0),而持有管道寫端的程序也沒有向管道中寫資料,這時有程序從管道讀端讀資料,那麼管道中剩餘的資料都被讀取後,再次read
會阻塞,直到管道中有資料可讀了才讀取資料並返回。
如果所有指向管道讀端的檔案描述符都關閉了(管道讀端的引用計數等於0),這時有程序向管道的寫端write
,那麼該程序會收到訊號sigpipe
,通常會導致程序異常終止。
如果有指向管道讀端的檔案描述符沒關閉(管道讀端的引用計數大於0),而持有管道讀端的程序也沒有從管道中讀資料,這時有程序向管道寫端寫資料,那麼在管道被寫滿時再次write
會阻塞,直到管道中有空位置了才寫入資料並返回。
使用管道通訊時必須把不適用的讀端或寫端關閉?
解答:根據上面管道的4種特殊情況,若未關閉管道的寫端,可能會造成讀端阻塞。(情況1)
若未關閉管道的讀端,管道寫滿後阻塞。(情況4)
Linux程序間通訊 使用匿名管道
在前面,介紹了一種程序間的通訊方式 使用訊號,我們建立通知事件,並通過它引起響應,但傳遞的資訊只是乙個訊號值。這裡將介紹另一種程序間通訊的方式 匿名管道,通過它程序間可以交換更多有用的資料。一 什麼是管道 如果你使用過linux的命令,那麼對於管道這個名詞你一定不會感覺到陌生,因為我們通常通過符號 ...
Linux程序間通訊 使用命名管道
在前一篇文章 linux程序間通訊 使用匿名管道 中,我們看到了如何使用匿名管道來在程序之間傳遞資料,同時也看到了這個方式的乙個缺陷,就是這些程序都由乙個共同的祖先程序啟動,這給我們在不相關的的程序之間交換資料帶來了不方便。這裡將會介紹程序的另一種通訊方式 命名管道,來解決不相關程序間的通訊問題。一...
程序間通訊 使用socket實現
socket套接字通訊,建立兩個程序交流 第乙個程序叫做jack,他想給rose打 於是他先要去買乙個手機 建立socket 並且還要知道rose的 號碼 對方ip和埠 jack 客戶端 如下 include include include include include include inclu...