名前付きパイプへの同時書き込みはどのように保証されますか?

名前付きパイプへの同時書き込みはどのように保証されますか?

たとえば、次の名前付きパイプを作成しました。

mknod myPipe p

一部のプロセス (たとえば、一部のサーバー) から読み取られました。たとえば、tailを使用しています。

tail -f myPipe

複数のクライアントプロセスがいくつかのメッセージを書き込んでいる場合、echo "msg" >> myPipeメッセージはインターリーブできますか? (例:

 <beginning of message1><message2><ending of message1>

それとも名前付きパイプに書き込むプロセスは原子的ですか?

ベストアンサー1

これは、各プロセスが書き込む量によって異なります(オペレーティングシステムがこれに関連してPOSIXに準拠していると仮定します)。 ~からwrite():

パイプまたはFIFOへの書き込み要求は、次の例外を除いて通常のファイルと同じ方法で処理する必要があります。
[...]

  • {PIPE_BUF}バイト以下の書き込み要求横断禁止他のプロセスのデータは同じパイプに書き込まれます。 {PIPE_BUF}バイトより大きい書き込みは、ファイルステータスフラグのO_NONBLOCKフラグが設定されているかどうかにかかわらず、他のプロセスからの書き込みとともに任意の境界のデータをインターリーブできます。

そこにも基本的な部分パイプとFIFO関連:

  • 原子/非原子: あるジョブで作成された合計量が別のプロセスのデータとインターリーブされない場合、書き込みはアトミックです。これは、単一のリーダーにデータを送信する複数の作成者がいる場合に便利です。アプリケーションは、書き込み要求がアトミックに実行できる規模を知る必要があります。この最大値を{PIPE_BUF}と呼びます。 POSIX.1-2008このボリュームは、{PIPE_BUF}バイトを超える書き込み要求がアトミックかどうかを指定しませんが、{PIPE_BUF}バイト以下の書き込みはアトミックでなければなりません。

ifの値はPIPE_BUF各実装によって定義されますが、最小値は512バイトです(参照:limits.h)。 Linuxでは4096バイトです(参照:pipe(7))。

おすすめ記事