bash でa | b | c | d
コマンド ラインで実行してから を押した^C場合、どのプロセスがシグナルを取得しますか?
質問する
1358 次
2 に答える
15
要するに、それらはすべてそうです。
パイプラインを設定するとき、シェルはプロセス グループを作成します。^C現在フォアグラウンドで実行中のプロセス グループを中断するユーザーの要求として、カーネルのライン規則によって解釈されます。プロセス グループなどにシグナルを送信するSIGINT
と、グループ内のすべてのプロセスにシグナルが自動的に配信されます。
于 2012-10-05T19:53:40.100 に答える
5
私は実験が好きです:
#!/bin/bash
# FILE /tmp/bla.sh
# trap ctrl-c and call ctrl_c()
trap ctrl_c INT
MY_ID=$1 # Identifier for messages
function ctrl_c() {
echo >&2 "GOODBYE $MY_ID"
exit
}
# This will continue until interrupted, e.g. if the input/output get closed
cat
# If we somehow got to the end
echo >&2 "grace $MY_ID"
繋いで、走って、壊して
nitz@mars:~$ /tmp/bla.sh 1 | /tmp/bla.sh 2
^CGOODBYE 2
GOODBYE 1
0
ご覧のとおり、両方の実行で割り込み信号が発生しました。つまり、すべてが強制終了されました。さらに、彼らが殺されたことを出力する順序はランダムです。
nitz@mars:~$ /tmp/bla.sh 1 | /tmp/bla.sh 2 | /tmp/bla.sh 3 | /tmp/bla.sh 4
^CGOODBYE 2
GOODBYE 4
GOODBYE 1
GOODBYE 3
于 2016-09-02T10:22:11.827 に答える