2014-10-07 21 views
1

在進行管道定義的同時,我提供了以下語句:FIFO可以具有多個讀取器或多個寫入器。每個寫入器的字節都是自動寫入的,最大值爲PIPE_BUF(Linux上爲4KB)。來自同時寫入器的塊可以交錯。類似的規則適用於同時讀取。我無法理解「來自同時寫作者的塊可以交錯」。可以有人explian?塊爲多個作家交錯管道?

回答

-1

假設您有兩個寫入程序A和B,它們試圖同時寫入一個數據塊,最後在管道中的數據看起來像ABAAAABBAABB。

+0

這並不總是正確的,其他答案在其描述中可能會更加完整。 – 2016-05-08 16:58:22

+0

@ ArranCudbard-Bell但這不是問題所在;它要求什麼「交錯塊」的含義。 – 2016-05-08 20:03:14

2

您必須在Advanced Linux Programming中閱讀過此內容。我想說,這是mistakably措辭,並打算與下段,該段說,有關Windows命名管道進行比較:

...的Win32可在不交錯數據上命名管道 多個讀寫器連接...

但根據Windows Dev Center

命名管道是一個命名的,單向或雙面管道的管道服務器和一個或多個管道客戶端之間的通信 。 的所有實例都有一個命名管道共享相同的管道名稱,但每個實例都有其自己的 緩衝區和句柄,併爲客戶端/服務器 通信提供了單獨的管道。使用實例可以使多個管道客戶端同時使用同一個命名管道。

因此,有實際參與多個管道連接(實例),並比較這些到一個UNIX管並沒有太大的意義,在我看來。

儘管如此,The Open Group Base Specifications說:

寫請求的管道或FIFO應以同樣的方式處理,一個 常規文件但下列情況除外: ...的 寫請求{} PIPE_BUF字節或更少的數據不得與其他進程寫入同一管道的數據進行交錯 。寫入大於{PIPE_BUF}個字節的 可能會有數據交織, 任意邊界,其他進程寫入, 是否設置了文件狀態標誌的O_NONBLOCK標誌。

所以,單個write請求到Linux(POSIX)管的數據的塊不是交錯(破壞)由另一個作者的請求的數據,只要要寫入的字節的數目不大於PIPE_BUF更大。

2

如果進程A試圖在進程B嘗試寫入PIPE_BUF(或更少)字節的同時寫入PIPE_BUF(或更少)字節,則可以保證寫入是原子化的,並且每個塊將保持完整(儘管它們的寫入順序是未指定的。)但是,如果進程A寫入的數據多於PIPE_BUF字節,則來自進程B的數據可能會出現在與來自進程A的數據交錯的管道中,並且操作系統不提供保證以防止數據從被交錯。如果要確保來自進程A的所有數據保持連續,則進程必須與其他一些機制同步。