名前のないパイプを作成するときに2つのファイル記述子が必要なのはなぜですか?

名前のないパイプを作成するときに2つのファイル記述子が必要なのはなぜですか?

私は名前のないパイプについて読みましたが、私が理解したように、パイプはメモリ内のバッファとして実装されています。パイプを作成するときは、バッファ(ファイル記述子)への2つのポインタを返すサイズ2の配列を渡す必要があります。インデックス0はパイプからの読み出しに使用され、インデックス1は書き込みに使用されます。

私の質問は、バッファが1つだけで、両方のインデックスが同じメモリ位置を指し、両方のプロセスが同時に読み書きできない場合、2つのファイル記述子が必要なのはなぜですか?私の質問に意味があることを願っています。

ベストアンサー1

@MelBoyceが彼のコメントで述べたように、これはパイプの概念的な性質によるものです。これには入力と出力があり、入力に書き込まれた順序とまったく同じ順序で出力からバイトを読み取ります。パイプは一般的なファイルやポインタではないため、パイプ内のどこでも読み書きできません。パイプに入る最初の未読バイトを強制的に読み取る必要があります。

パイプはメモリ内のバッファとして実装することができますが、将来より効率的な他の方法が開発された場合、実装は異なる可能性があります。ただし、パイプラインの概念的な特性は変わりません。それでも同じシステムコールを使用しread(2)write(2)同じように動作します。呼び出されたときに得られたファイル記述子は、pipe(2)パイプを正しく使用するように強制するために使用されます(追加でいくつかのアクセス制御を提供します)。これにより、将来の実装修正によってコードが破損することはありません。

おすすめ記事