Bashコマンドのパイプはどのように機能しますか?

Bashコマンドのパイプはどのように機能しますか?

パイプを介してbashコマンドを接続すると、象徴的なことが起こりますか、それともすべて計算 - 通過 - 計算 - 通過ですか?

たとえば、head t.txt -n 5 | tail -n 2計算head t.txt -n 5し、tail -n 2実行します。それとも最初にシェルに3〜5行を読み込むように指示する抽象化はありますか?おそらくこの例では違いはないようですが、他の場合は違いがあるようです。

ベストアンサー1

シェルはpipe(2)システムコールを使用して、2つのファイル記述子を持つカーネルに制限されたバッファを生成します。 1つはプロセスがバッファに書き込むことを可能にし、もう1つはプロセスがバッファから読み取ることを可能にします。

簡単なケースを考えてみましょう:

$ p1 | p2

この場合、概念的にはシェルは上記のパイプをfork()作成し、子は標準出力ストリームをパイプの書き込みの終わりに接続してから子exec()sを接続しますp1。次に、シェルはfork()再びsで、子は標準入力ストリームをパイプの読み取り端に接続してから子exec()sに接続しますp2。 (私は言った概念的にシェルは異なる順序で操作を実行できますが、アイデアは同じです。 )

その当時はp1p2同時に実行中でした。 p1パイプに書き込まれ、カーネルは書き込まれたデータをバッファにコピーします。 p2パイプから読み取られ、カーネルはバッファから読み取られたデータをコピーします。パイプがいっぱいになると、カーネルはパイプから何かを読み取るまでp1呼び出しをブロックし、いくつかのスペースを解放します。パイプが空の場合、カーネルはパイプにさらにデータが書き込まれるまで呼び出しをブロックします。write()p2p2read()p1

おすすめ記事