SIGINTを受け取った後もこのスクリプトが実行され続けるのはなぜですか?

SIGINTを受け取った後もこのスクリプトが実行され続けるのはなぜですか?

私はそれから学んだhttps://unix.stackexchange.com/a/230568/674SIGINTを受信したときにゼロで終了すると、pingそのコマンドを含むbashスクリプトがping終了するのではなく実行できます。

同様の動作をするスクリプトがあります。

#!/bin/bash                                                                                                                                                                       

while true; do
    sudo -S sleep 4;
    echo $?
    sudo -k;
done

実行時にパスワードの入力を求められたら、Ctrl-C と入力するとスクリプトは終了せずに実行を続けます。唯一の違いは、sudoSIGINTを受け取った後、0ではなく1で終了することです。もしそうなら、bashスクリプトが終了せずに実行され続けるのはなぜですか?ありがとうございます。

$ ./test.sh 
[sudo] password for t: 
1
[sudo] password for t: 
1
[sudo] password for t: 
1
...

ベストアンサー1

このテストは単なる「コマンドが成功したか」テストではありません。プロセスが SIGINT で終了すると、終了状態は次に読み出すことができます。wait(2)WIFSIGNALEDandを使用すると、WTERMSIGbashは子プロセス(この場合はsudo)がシグナルによって直接終了したかどうかを確認できます。

Ctrl + Cを押したときのシステムコールの結果は次のとおりですcat(に従ってstrace)。

wait4(-1, [{WIFSIGNALED(s) && WTERMSIG(s) == SIGINT}], 0, NULL) = 9357

以下でCtrl + Cを押したときの結果ですsudo -S sleep 4

wait4(-1, [{WIFEXITED(s) && WEXITSTATUS(s) == 1}], 0, NULL) = 9479

完全性のために、Ctrl + C'ingの結果は次のとおりですping localhost

wait4(-1, [{WIFEXITED(s) && WEXITSTATUS(s) == 0}], 0, NULL) = 9710

おすすめ記事