11

man pipe -s7 ドキュメントのパイプへの書き込みは非常にうまくいきました。私にとって重要な部分は、O_NONBLOCK が設定されていて、書き込みの長さが PIPE_BUF よりも大きい場合、書き込みが部分的にしか完了しないということです。

しかし、読み終わりについては何も言われていません。

書き込み終了時にブロック モードで、パイプを介してイベントを表す構造体を送信しています。読み取りの最後に、非ブロッキング モードの更新ループでこれらのイベント (およびその他のもの) を処理しています。

私の構造体は PIPE_BUF よりも小さいので、 read は常に整数の構造体を読み取りますか? または、構造体の一部のみが読み取られる可能性を処理する必要がありますか?

常識的には、読み取り動作は文書化された書き込み動作を反映していると私は言いますが、これが指定されていればもっとうれしいです。

Linux(カーネル3.8、x86_64)で作業しています。しかし、私のコードがさまざまな UNIX フレーバーや CPU アーキテクチャ間で移植可能であることは重要です。

ありがとう。クリス。

4

2 に答える 2

7

コメントは正しいですread。アトミックではありません。アトミック性の全体的なポイントは、writeデータのインターリーブによる破損なしに複数のライターを許可することです。複数のリーダーはあまり役に立ちませんが、たとえそれらが有用であったとしても、アトミック読み取りをサポートするには、存在しないパイプでパケット境界を維持する必要があります。

于 2013-02-02T15:46:51.343 に答える