1. 程式人生 > >有名管道(二)

有名管道(二)

 

一、從FIFO中讀取資料:

約定:如果一個程序為了從FIFO中讀取資料而以阻塞的方式開啟FIFO,則稱核心為該程序的讀操作設定了阻塞標誌。

  • 如果有程序為寫而開啟FIIF(寫端存在),且當前FIFO內沒有資料,則對於設定了阻塞標誌的讀操作來說,將一直阻塞,對於沒有設定阻塞標誌讀操作來說返回-1,當前errno值為EAGAIN提醒以後再試。
  • 對於設定阻塞標誌的讀操作來說,造成阻塞的原因有兩種,當前FIFO內有資料,但其他程序正在讀這些資料;另外FIFO內沒有資料。解阻塞的原因則是FIFO中有新的資料寫入,不論寫入資料量的大小,也不論讀操作請求多少資料量。
  • 如果沒有程序寫開啟FIFO,則設定了阻塞標誌的讀操作會阻塞。
  • 如果寫端關閉,管道中有資料讀取管道中的資料,如果管道沒有資料讀端將不會繼續阻塞,此時返回0。(注意:如果FIFO有資料,則設定了阻塞標誌的讀操作來說不會因為FIFO的位元組數小於請求讀的位元組數而阻塞,讀操作會返回FIFO現有的資料量。)

 

二、向FIFO中寫入資料

約定:如果一個程序為了向FIFO中寫入資料而阻塞開啟FIFO,那麼稱該程序內的寫操作設定了阻塞標誌。

1. 對於設定了阻塞標誌的寫操作:

  • 當寫入資料量不大於PIPE_BUF時,linux將保證寫入的原子性,如果此時管道空閒緩衝區不足以容納要寫入的位元組數,則進入睡眠,直到緩衝區中能夠寫入的位元組數,才開始進行一次性寫操作。
  • 當要寫入的資料量大於PIPE_BUF時,Linux將不再保證寫入的原子性。FIFO緩衝區一有空閒,寫程序就會試圖向管道寫入資料,寫操作在寫完所有請求寫的資料後返回。

2. 對於沒有設定阻塞標誌的寫操作:

  • 當要寫入的資料量大於PIPE_BUF時,Linux將不再保證寫入的原子性。在寫滿所有FIFO空閒緩衝區後,寫操作返回。
  • 當要寫入的資料量不大於PIPE_BUF時,linux將保證寫入的原子性,如果當前FIFO空閒緩衝區能夠容納寫入的位元組數,寫完成功返回;如果當前FIFO空閒緩衝區不能容納請求寫入的位元組數,則返回EANGIN錯誤,提醒以後再寫。