防止讀匿名管道的無限阻塞問題的方法

2021-07-02 16:19:01 字數 575 閱讀 3904

假設程式維護乙個匿名管道,fd[0]讀端,fd[1]寫端。父程序從管道中讀資料,子程序迴圈讀取乙個檔案並將讀到得到內容寫入管道。

這時如果不注意的話,很容易出現讀管道的無限阻塞。

讀管道如下 nread = read(fd[0],buffer,size);

當父程序 向管道中寫入最後資料時,最後一次寫入的資料可能比size小,也就是管道中的資料少於size。這時我的程式出現了read()一直阻塞。

按理說用read讀取檔案時,如果檔案內容少於size,會返回實際讀取的位元組數,但是此處就是一直阻塞。

為這個問題找了很久原因,因為如果一直阻塞的話,就有可能資料讀取不完整。

最後發現是這個原因:

對於匿名管道,讀程序和寫程序初始都會擁有fd[0],fd[1],兩個程序各自一套,寫程式時一定要注意在寫程序裡面 close(fd[0]),在讀程序裡面 close(fd[1]),在寫程序寫任務執行完之後務必 close(fd[1]),讀程序讀完之後務必 close(fd[0])。

只有在每個程序中的fd[1]關閉了之後,read()函式才會認為管道不會再寫進資料了,在這種情況下,不足size的內容才會被正確的·讀取出來。

Linux有名管道(FIFO)的阻塞和非阻塞讀寫

有名管道的讀寫有阻塞和非阻塞兩種,可以在open 時指定,下面我們對各種情況進行一些討論。寫程序 include include include include include include define fifo name tmp myfifo main 以阻塞型只寫方式開啟fifo fd op...

匿名管道 程序間的通訊

匿名管道 匿名管道是一種未命名的 單向管道,通常用來在乙個父程序和乙個子程序之間傳輸資料。匿名的管道只能實現本地機器上兩個程序間的通訊,而不能實現跨網路的通訊。1.1匿名管道 匿名管道是一種未命名的 單向管道。通常用來在父程序和子程序之間傳輸資料。匿名管道總是本地的,不能在網路之間傳遞資料。1.1....

C 匿名管道的理解與實現

什麼是匿名管道?匿名管道用於程序之間通訊,且僅限於本地父子程序之間通訊,結構簡單,類似於一根水管,一端進水另一端出水 單工 相對於命名管道,其占用小實現簡單,在特定情況下,比如實現兩圍棋引擎本地對戰可以使用匿名管道。怎樣實現匿名管道雙向通訊?由於匿名管道是單工的,所以為實現父子程序雙向通訊需要建立兩...