~から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_IGN
bashでシグナルハンドラを設定する方法とシグナルハンドラを空のコマンドで設定することがに設定するの""
と同じであることを理解してくださいSIG_IGN
。
SIG_DFL
Bashで信号トラップを設定する方法に関する同様の質問です。
ありがとうございます。
答え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 "" INT
bash
trap - INT