在進行管道定義的同時,我提供了以下語句:FIFO可以具有多個讀取器或多個寫入器。每個寫入器的字節都是自動寫入的,最大值爲PIPE_BUF(Linux上爲4KB)。來自同時寫入器的塊可以交錯。類似的規則適用於同時讀取。我無法理解「來自同時寫作者的塊可以交錯」。可以有人explian?塊爲多個作家交錯管道?
回答
假設您有兩個寫入程序A和B,它們試圖同時寫入一個數據塊,最後在管道中的數據看起來像ABAAAABBAABB。
您必須在Advanced Linux Programming中閱讀過此內容。我想說,這是mistakably措辭,並打算與下段,該段說,有關Windows命名管道進行比較:
...的Win32可在不交錯數據上命名管道 多個讀寫器連接...
命名管道是一個命名的,單向或雙面管道的管道服務器和一個或多個管道客戶端之間的通信 。 的所有實例都有一個命名管道共享相同的管道名稱,但每個實例都有其自己的 緩衝區和句柄,併爲客戶端/服務器 通信提供了單獨的管道。使用實例可以使多個管道客戶端同時使用同一個命名管道。
因此,有實際參與多個管道連接(實例),並比較這些到一個UNIX管並沒有太大的意義,在我看來。
儘管如此,The Open Group Base Specifications說:
寫請求的管道或FIFO應以同樣的方式處理,一個 常規文件但下列情況除外: ...的 寫請求{} PIPE_BUF字節或更少的數據不得與其他進程寫入同一管道的數據進行交錯 。寫入大於{PIPE_BUF}個字節的 可能會有數據交織, 任意邊界,其他進程寫入, 是否設置了文件狀態標誌的O_NONBLOCK標誌。
所以,單個write
請求到Linux(POSIX)管的數據的塊不是交錯(破壞)由另一個作者的請求的數據,只要要寫入的字節的數目不大於PIPE_BUF更大。
如果進程A試圖在進程B嘗試寫入PIPE_BUF(或更少)字節的同時寫入PIPE_BUF(或更少)字節,則可以保證寫入是原子化的,並且每個塊將保持完整(儘管它們的寫入順序是未指定的。)但是,如果進程A寫入的數據多於PIPE_BUF字節,則來自進程B的數據可能會出現在與來自進程A的數據交錯的管道中,並且操作系統不提供保證以防止數據從被交錯。如果要確保來自進程A的所有數據保持連續,則進程必須與其他一些機制同步。
- 1. 管道多個jenkins工作
- 2. 多個管道作業與單個大型管道作業
- 3. 多分支管道與管道作業
- 4. 多管道不工作
- 5. 爲什麼這個管道工作?
- 6. 你管渠道作爲JSON
- 7. RX IObservable作爲管道
- 8. 管道操作者行爲
- 9. 管道輸出到兩個不交錯的命令不是交錯的
- 10. 管道有多個命令
- 11. C編碼多個管道
- 12. 選擇多個管道
- 13. Golang exec.Command多個管道
- 14. 視覺作曲家文本塊錯誤
- 15. 如何配置Jenkins多分支管道作爲子模塊構建?
- 16. 2個孩子寫信給管道,家長從管道中讀取C
- 17. tinylog的多個作家
- 18. 作爲一個提交多個表單
- 19. 多線程需要多個管道
- 20. 家長不從管道讀取
- 21. Powershell交換CU11管道|
- 22. 管道成腳本塊
- 23. 無模塊 - scrapy管道
- 24. 多模塊行家釋放
- 25. 爲什麼在節點塊child_process.exec中打開一個fifo管道?
- 26. 多管道實施。不工作
- 27. 多處理管道()不工作
- 28. 一個管道中的多個整理操作
- 29. 碳多重管道
- 30. perl多管道CLOEXEC
這並不總是正確的,其他答案在其描述中可能會更加完整。 – 2016-05-08 16:58:22
@ ArranCudbard-Bell但這不是問題所在;它要求什麼「交錯塊」的含義。 – 2016-05-08 20:03:14