GNU Cライブラリのマニュアルでは、パイプの読み出しと書き込みの両方が可能であると簡単に言及しています。原子
パイプ・データの読取りまたは書込みは、作成されたデータ・サイズがPIPE_BUFより大きくない場合、原子性です。
ただし、Linuxのマニュアルページは次のとおりです。男性用チューブ7本、読書が原子的であることは言及しないでください。男2を読む読み取りがシグナルによって中断された場合、読み取りが要求されたものより少ない量を返すことができることを明確にします。
それでは、長さが読み取りより短いパイプへの読み取り呼び出しは、PIPE_BUF
Linuxで実際にアトミックですか?
具体的には、パイプ内の単一のライターが常に12バイトのブロックを書き、そのパイプにそのパイプから12バイトを読み取る2人の同時リーダーがある場合、そのリーダーは正確に12バイトを読み取るか、次のようEAGAIN
なエラーが発生します。部分読み込みは可能ですか?
PIPE_BUF/12
また、作成者が12バイトのチャンクで作成したが、同時リーダーが最大チャンクを一度に読み取ろうとする場合はどうなりますか?成功した読み取りは常に12バイトの正確な乗数を返しますか、それとも必要なバイト数を返すことができますか?
答え1
ソースコードを見ると、Linuxカーネルでpipe_read
inの実装がsource/fs/pipe.c
大幅に変更されましたが、inのコードをすばやく読むと2.0.40、2.4.37、2.6.32、3.11そして4.9read
、書き込みサイズがあるかブロックされるたびに勝つそしてサイズを読むアル字型そしてアル字型>勝つそれではread
、少なくとも戻ってきます。勝つバイト。したがって、固定サイズのブロック(より小さいサイズPIPE_BUF
)があり、常に同じサイズのデータを読み取る場合は、常にブロック全体を読み取ることが効果的に保証されます。
一方、可変サイズチャンクがある場合は、そのような保証はありません。書き込み側でのみ原子性が保証されます。それより少ない書き込みはPIPE_BUF
他の作者によって切り捨てられません。ただし、リーダー側では、10バイトを書き込んでから20バイトを書き、15バイトを読み取ろうとすると、最初の書き込みと2番目の書き込みの両方が行われます。入力された最初の5バイトが記録されます。呼び出しread
はブロックする必要があるか、出力バッファがいっぱいになるまでデータの読み取りを停止しません。
データをチャンクに転送するには、次のようにします。データグラムソケットパイプの代わりに。