bash でシグナルトラップを SIG_IGN および SIG_DFL に設定するにはどうすればよいですか?

bash でシグナルトラップを SIG_IGN および SIG_DFL に設定するにはどうすればよいですか?

からhttps://unix.stackexchange.com/a/447032/674

したがって、コードに関しては、SIGINT信号を想定すると、次の 3 つのオプションがあります。

  • signal(SIGINT, SIG_IGN);無視する
  • 関数を呼び出さないsignal()、または関数を呼び出してsignal(SIGINT, SIG_DFL);デフォルトのアクション(つまりプロセスを終了させる)を実行する
  • signal(SIGINT, termination_handler);ここで、はtermination_handler()信号が最初に発生したときに呼び出される関数です。

bash では、シグナルのハンドラーをどのように設定すればよいでしょうかSIG_IGN?

trap "" INT

シグナル ハンドラとして空のコマンドを設定します""。しかし、本当にハンドラが に設定されるのでしょうかSIG_IGN?

bash が外部コマンドを実行すると、シグナル トラップがデフォルトにリセットされ、無視されたシグナルは無視されたままになります。そのため、SIG_IGNbash でシグナル ハンドラーを設定する方法と、シグナル ハンドラーを空のコマンドに設定することがに""設定することと同じかどうかを知ることが重要ですSIG_IGN

bashでシグナル トラップを設定する方法についても同様の質問がありますSIG_DFL

ありがとう。

答え1

POSIXのドキュメントより特別な組み込みユーティリティtrap:

action が の場合-、シェルは各条件をデフォルト値にリセットします。action が null ( "") の場合、シェルは指定された各条件が発生してもそれを無視します。それ以外の場合、対応する条件のいずれかが発生したときに、引数 action がシェルによって読み取られ、実行されます。

これは、 の後のスクリプトがシグナルtrap "" INTを無視しINT、 を使用してトラップをデフォルトにリセットできることを意味しますtrap - INT

答え2

私は次のスクリプトを使用しました:

#!/bin/bash
trap "" INT
trap - INT

そして走りました:

$ strace bash script.sh 2>&1 | grep INT

出力の中には次のものが含まれています。

read(3, "#!/bin/bash\ntrap \"\" INT\ntrap - I"..., 80) = 35
read(255, "#!/bin/bash\ntrap \"\" INT\ntrap - I"..., 35) = 35
rt_sigaction(SIGINT, {sa_handler=SIG_IGN, sa_mask=[], sa_flags=SA_RESTORER, sa_restorer=0x7f24e88f2030}, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=SA_RESTORER, sa_restorer=0x7f24e88f2030}, 8) = 0
rt_sigaction(SIGINT, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=SA_RESTORER, sa_restorer=0x7f24e88f2030}, {sa_handler=SIG_IGN, sa_mask=[], sa_flags=SA_RESTORER, sa_restorer=0x7f24e88f2030}, 8) = 0

sa_handler=SIG_IGN最初の呼び出しのrt_sigaction()sa_handler=SIG_DFL2 番目の呼び出しのを考えると、trap "" INTbashシグナルを実際に無視し、trap - INTはデフォルトのハンドラーにリセットするように見えます。

関連情報