端末でパイプラインを実行しているとします。
$ a | b
端末から両方のプロセスに信号を送信する方法はありますか?それとも、2つのプロセスの1つの端末からのみ標準入力を読み取ることができますか?
b
以下を使用して標準入力から読み取ることができます。
open /dev/tty
a
しかし、これは私のテストでstdinを読むことができないようです。なぜ?
デフォルトでは、パイプctrlに送信したりstdinから読み込んだときにc信号は受信されません(私のテストによると)。ctrldb
a
ベストアンサー1
Ctrl-Cなどの信号はstdinを介して渡されないことを明確にする必要があります。端末にCtrl-Cを入力すると、「Ctrl」と「C」は2つの生の文字でプロセスに直接渡されず、ttyドライバはそれをSIGINT信号として解釈し、信号をフォアグラウンドプロセスグループに送信します。
実行中にCtrl-Cを入力すると、
a | b
両方のプロセスがSIGINT信号を受け取ります。これをテストするには、コマンドの実行中にCtrl-Cを入力します。
tail -f /var/log/syslog | grep some_pattern
両方のプロセスが中断されたことを意味するシェルプロンプトがすぐに表示されます。
どうですか?
シェルにログインしたら、次のように入力します。会議、シェルで実行されるすべてのプログラムはこのセッションに属します。
セッションは制御端子、通常はキーボードから入力を受け取り、画面に出力します。このセッションのプロセスは、制御端末からstdinを読み取り、stdoutとstderrを制御端末に書き込み、制御端末から信号を受け取ります。
シェルパイプに接続されたプロセスはプロセスグループを形成する。たとえば、
proc1 | proc2 &
または好き
proc3 | proc2 | proc5
セッションは1つを持つことができますフォアグラウンドプロセスグループそして一つ以上バックグラウンドプロセスグループ。シェルをブロックして前景画面を占めるプロセスグループは、前景プロセスグループです。そして実行されるプロセスグループは
&
バックグラウンドプロセスグループになります。制御端末に「Ctrl-C」などのシーケンスを入力するたびに、信号は前景プロセスグループ内のすべてのプロセスに送信されます。