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

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

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_IGN在 bash 中設定訊號處理程序以及將訊號處理程序設定為空命令是否""與設定為SIG_IGN.

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

謝謝。

答案1

來自 POSIX 文檔特殊的內建實用程序trap

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

這表示您的腳本 aftertrap "" 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_DFL第二次調用中的 ,看起來確實trap "" INT導致bash忽略該信號,並trap - INT導致其重置為預設處理程序。

相關內容