Linux

我們如何在 bash 中將信號陷阱設置為 SIG_IGN 和 SIG_DFL?

  • June 1, 2018

來自https://unix.stackexchange.com/a/447032/674

所以在程式碼方面,假設SIGINT信號,這些是三個選項:

  • 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.

關於如何SIG_DFL在 bash 中設置信號陷阱的類似問題。

謝謝。

特殊內置實用程序trap的 POSIX 文件中:

如果 action 是-,shell 會將每個條件重置為預設值。如果 action 為 null ( ""),shell 將忽略每個出現的指定條件。否則,當相應條件之一出現時,shell 應讀取並執行參數動作。

這意味著您的腳本在 之後trap "" INT將忽略該INT信號,並且您可以使用 將陷阱重置為預設值trap - INT

我拿了這個腳本:

#!/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_DFL第二次呼叫,它看起來trap "" INT導致bash真正忽略信號,並trap - INT導致它重置為預設處理程序。

引用自:https://unix.stackexchange.com/questions/447229