linux - 匿名管道写的原子性
伊谢尔伦
伊谢尔伦 2017-04-17 15:27:08
0
1
572

命名管道FIFO中提供了写操作的原子化,但存在多个写者(生产者)同时往一个管道中写的时候只要每一次写操作的数据长度小于PIPE_BUF就能保证这些数据要么全部写入要么阻塞等待(或出错返回),这样就保证了两次写的数据不会交错。
想请教一下匿名管道并没有提供这样的功能,那么当有多个写者同时往一个管道中写的时候是否会出现数据交错的问题?

伊谢尔伦
伊谢尔伦

小伙看你根骨奇佳,潜力无限,来学PHP伐。

全部回覆(1)
Peter_Zhu

named pipeanonymouse pipe的原子性保證是由readwrite來保證的。

write():
{PIPE_BUF} 個位元組或更少的寫入請求不得與在同一管道上進行寫入的其他程序的資料交錯。大於 {PIPE_BUF} 位元組的寫入可能會在任意邊界上與其他進程的寫入交錯數據,無論檔案狀態標誌的 O_NONBLOCK 標誌是否設定。
read():
成功完成後,其中nbyte大於0,read()應標記更新檔案的最後資料存取時間戳,並應傳回讀取的位元組數。該數字絕不能大於 nbyte。如果檔案中剩餘的位元組數小於nbyte,如果read() 請求被訊號中斷,或者如果檔案是管道、FIFO 或特殊檔案並且少於nbyte,則傳回的值可能小於nbyte nbyte 位元組立即可供讀取。例如,從與終端機關聯的檔案執行 read() 可能會傳回一行鍵入的資料。

所以在長度限定下都是原子的。

熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板