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);andを使用して呼び出さないでください。プロセスを終了するデフォルトの動作が発生することを許可します。
  • signal(SIGINT, termination_handler);termination_handler()信号が最初に発生したときに呼び出される関数はどこにありますか?

Bashでシグナルハンドラをどのように設定しますかSIG_IGN

trap "" INT

空のコマンドをシグナルハンドラ""に設定します。しかし、実際にハンドラをに設定しますかSIG_IGN

bash が外部コマンドを実行すると、信号トラップをデフォルト値にリセットし、無視された信号は無視されます。したがって、SIG_IGNbashでシグナルハンドラを設定する方法とシグナルハンドラを空のコマンドで設定することがに設定するの""と同じであることを理解してくださいSIG_IGN

SIG_DFLBashで信号トラップを設定する方法に関する同様の質問です。

ありがとうございます。

答え1

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

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

これは、後のスクリプトがシグナルを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()と2番目の呼び出しのエラーを考慮すると、信号は無視され、デフォルトのハンドラにリセットされるようにsa_handler=SIG_DFL見えます。trap "" INTbashtrap - INT

関連情報