處理訊號的選擇?

處理訊號的選擇?

來自APUE

進程有三種處理訊號的選擇。

  1. 忽略信號。對於表示硬體異常的訊號,例如除以零或引用進程位址空間之外的內存,不建議使用此選項,因為結果未定義。

  2. 讓預設操作發生。對於被零除的情況,預設是終止進程。

  3. 提供一個在訊號發生時呼叫的函數(這稱為「捕獲」訊號)。透過提供我們自己的函數,我們將知道訊號何時發生,並且我們可以按照我們的意願處理它。

  1. 我認為只有兩個選擇——上面列出的最後兩個,它們都可以“忽略信號”(上面列出的第一個選擇)。

    我的理解是否正確,或者確實存在引用中的三個不重疊的選擇?為什麼?

  2. 書中提到,某些訊號的預設操作是忽略它。這是否意味著訊號的動作是SIG_IGN或SIG_DFL或空函數?例如:

    預設SIGCHLD 的操作是被忽略。我們將在第 10 章中描述這些選項。

    訊號控制: 預設 操作是繼續停止的進程,但是 忽略如果進程沒有停止則發出信號。

謝謝。

答案1

當然,我們可以編寫一個不執行任何操作的訊號處理程序,從而有效地忽略該訊號,但第一個選項是透過使用系統呼叫的SIG_IGN參數來專門忽略該訊號signal()

因此,就程式碼而言,假設SIGINT訊號,有以下三個選項:

  • signal(SIGINT, SIG_IGN);忽略
  • 不呼叫signal()函數,或呼叫它,signal(SIGINT, SIG_DFL);從而讓預設操作發生,即終止進程
  • signal(SIGINT, termination_handler);,其中termination_handler()是訊號第一次出現時呼叫的函數。

來源:https://www.gnu.org/software/libc/manual/html_node/Basic-Signal-Handling.html

對於訊號的特定情況,預設操作是忽略訊號,前兩個選項(SIG_IGNSIG_DFL)是相同的。除了(小)開銷之外,建立一個空處理函數可能不會產生明顯的效果。

注意:signal()為了簡單起見,在這個答案中使用了 ,但sigaction()出於可移植性的原因,建議在新程式碼中使用 。

相關內容