13

bash でa | b | c | dコマンド ラインで実行してから を押した^C場合、どのプロセスがシグナルを取得しますか?

4

2 に答える 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 に答える