![STDIN読み取りは他のプロセスの多くの書き込みと競合していますか? [閉鎖]](https://linux33.com/image/128100/STDIN%E8%AA%AD%E3%81%BF%E5%8F%96%E3%82%8A%E3%81%AF%E4%BB%96%E3%81%AE%E3%83%97%E3%83%AD%E3%82%BB%E3%82%B9%E3%81%AE%E5%A4%9A%E3%81%8F%E3%81%AE%E6%9B%B8%E3%81%8D%E8%BE%BC%E3%81%BF%E3%81%A8%E7%AB%B6%E5%90%88%E3%81%97%E3%81%A6%E3%81%84%E3%81%BE%E3%81%99%E3%81%8B%EF%BC%9F%20%5B%E9%96%89%E9%8E%96%5D.png)
私のアプリケーションの1つ(例:「A」)はいくつかの警告をSTDINにプッシュし、アプリケーションのシェルスクリプトはそのSTDINを読み取って処理します。同様に、出力をSTDINにプッシュできる他のアプリケーション(B、C、Dと呼ばれる)があります。
私の最初のアプリが他のアプリのSTDINプッシュを読み取ることができ、データがクラッシュする可能性があるかどうか疑問に思います。 (AのSTDINを読むと、B、CのSTDINの内容がわかりますか?)
答え1
この場合、有用な「STDIN of A」はありません。 STDINは常にあなたのアプリケーション。 a、b、cはSTDOUTに書き込まれ、括弧はそれらを一緒に囲み、パイプは結果をアプリケーションのSTDINに接続します。はい、これらのすべてのSTDOUTは競合する可能性があります(絡み合っていないが1つずつ)。
( a ; b; c ) | yourapp
または
( a && b && c ) | yourapp
a、b、cがシェルスクリプト(「アプリケーションのシェルスクリプト」)内にあるかどうか、そしてそれがすべてスクリプトであるかどうかはわかりません。そうでない場合、スクリプトは「アプリケーション」であり、上記のシナリオにあります。その場合は、次のようなものが必要です。
while ...; do
read something
a
b
c
done
上記のシナリオでは、「読み取り」は、外部アプリケーションの通常のSTDINを順番に読み直して読み取る内容がないとブロックすることができますが、Aがどのようにアイテムをここにプッシュできるかわかりません.
わかりませんが、名前付きパイプやメッセージブローカーが役に立つ可能性があると思われます。