パイプは標準入力にどのような影響を与えますか?

パイプは標準入力にどのような影響を与えますか?

Cプログラムを作成したいのですが、解析する必要がありますstdin。入力すると、cat file.txt | grep -v matchfromはどのように解析されますか?シリーズですか? 2つの異なる文字列ですか?私は走り、そこで(見かけ上)便利なものを見つけることができませんでした。stdoutcat-v matchcat /dev/pts/0file /dev/pts/0

ベストアンサー1

管路読み取りおよび書き込み側に関連するファイル記述子を含むカーネルに割り当てられたバッファー。実行時cat file.txt | grep -v match

  • シェルはパイプを生成します(pipe()システムコールを使用して)
  • シェルfork()S. サブプロセスはdup2()システムコールを使用して標準出力ストリームを閉じ、パイプの書き込み端を標準出力にコピーします。 (その後、標準出力への書き込みはカーネルバッファに移動します。)その後、子プロセスは更新された標準出力を持ちexec()ます。cat
  • シェルがfork()再び表示されます。サブプロセスはdup2()システムコールを使用して標準入力ストリームを閉じ、パイプの読み出し端を標準入力にコピーします。 (以降、標準入力の読み取りはカーネルバッファで行われます。)その後、サブプロセスは標準入力を更新しましたexec()grep

現在、および両方がcat実行されていますgrepgrep標準入力(パイプ)から読み取ろうとし、パイプが空の場合、読み取りはブロックされます。cat標準出力(再パイプ)に書き込もうとし、パイプがいっぱいになると書き込みがブロックされます。それ以外の場合は、catバッファに書き込むときにgrepバッファから読み取ることができます。

おすすめ記事