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

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

伊谢尔伦
伊谢尔伦

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

全員に返信(1)
Peter_Zhu

named pipe および anonymouse pipe の原子性の保護は、read および write によって保護されます。

write():

{PIPE_BUF} バイト以下の書き込みリクエストは、同じパイプ上で書き込みを行う他のプロセスからのデータとインターリーブされません。 {PIPE_BUF} バイトを超える書き込みでは、ファイル ステータス フラグの O_NONBLOCK フラグが設定されているかどうかに関係なく、任意の境界で他のプロセスによる書き込みとデータがインターリーブされる可能性があります。
read():
正常に完了するとnbyte が 0 より大きい場合、read() はファイルの最後のデータ アクセス タイムスタンプを更新用にマークし、読み取られたバイト数を返します。この数値は nbyte を超えることはできません。ファイルに残っているバイト数が nbyte 未満の場合、read() リクエストがシグナルによって中断された場合、またはファイルがパイプ、FIFO、または特殊ファイルであり、バイト数が nbyte 未満である場合、返される値は nbyte 未満になることがあります。 nbyte バイトをすぐに読み取ることができます。たとえば、端末に関連付けられたファイルからの read() は、入力された 1 行のデータを返す場合があります。

したがって、長さが限定されるものはすべて原子です。
いいねを押す +0
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!