あなたの質問について間違っていると目立つのは、あなたが言うことだけです
Aが最初に実行され、次にBがAの標準出力を取得します
実際、両方のプログラムはほぼ同時に開始されます。B
読み込もうとするときに入力がない場合、読み込む入力があるまでブロックします。同様に、から出力を読み取っている人がいない場合A
、出力が読み取られるまで書き込みがブロックされます(一部はパイプによってバッファリングされます)。
パイプラインに参加するプロセスを同期する唯一のことは、I / O、つまり、パイプを介した読み取りと書き込みです。書き込みまたは読み取りが発生しない場合、2つのプロセスは互いに完全に独立して実行されます。一方が他方の読み取りまたは書き込みを無視すると、無視されたプロセスはブロックされ、他のプロセスが終了すると、最終的にSIGPIPE
シグナル(書き込みの場合)によって強制終了されるか、標準入力ストリームでファイルの終わり状態になります(読み取りの場合) 。
慣用的な記述方法A | B
は、2つのプログラムを含むパイプラインであるということです。最初のプログラムの標準出力で生成された出力は、2番目の標準入力で読み取ることができます(「[の出力] A
は[の入力] にパイプされますB
」)。シェルは、これを可能にするために必要な配管を行います。
「消費者」と「プロデューサー」という言葉を使いたいなら、それも大丈夫だと思います。
これらがCで書かれたプログラムであるという事実は関係ありません。これがLinux、macOS、OpenBSD、またはAIXであるという事実は関係ありません。