簡體   English   中英

用戶級程序應該捕獲哪些“致命”信號?

[英]Which “fatal” signals should a user-level program catch?

首先, 我知道過去有類似的問題

但這個問題沒有得到妥善回答。 相反,它轉而建議如何捕捉信號。

所以只是為了澄清:我已經完成了處理信號所需要做的一切。 我有一個應用程序,它通過管道分配監視主進程的守護進程。 如果主進程崩潰(例如分段錯誤),它有一個信號處理程序,它將所有必需的信息寫入管道並中止。

目標是在應用程序發生不良事件時盡可能多地獲取信息,而不用處理“正常”操作,例如SIGHUP,SIGUSR1等。

所以我的問題是: 我應該抓住哪些信號? 我的意思是說,如果沒有我捕獲它們的信號會導致應用程序中止。

到目前為止,我已經提出以下列表:

  • SIGINT(^ C,用戶啟動,但仍然很好知道)
  • SIGTERM(從shell或AFAIK中kill <pid> ,可以是OutOfMemory的結果)
  • SIGSEGV
  • SIGILL
  • SIGFPE
  • SIGBUS
  • SIGQUIT

有人知道我是否錯過了什么? kill -l有很多...... :)

我正在查看我的高級編程副本unix環境(Stevens)。 根據有關信號的部分中的表格,如果您沒有捕獲它們,則以下POSIX信號將默認終止該過程。 監控您不使用的所有這些並不是不合理的:

  • SIGABRT
  • SIGALRM
  • SIGFPE
  • SIGHUP
  • SIGILL
  • SIGINT
  • SIGKILL
  • SIGPIPE
  • SIGQUIT
  • SIGSEGV
  • SIGTERM
  • SIGUSR1
  • SIGUSR2

除了SIGKILL,你可以捕獲所有這些,但希望SIGKILL不會經常出現給你。

請注意,您的信號手冊頁( man 7 signal )應該為您的系統提供正確的列表 - 這是POSIX列表,並且可能因您的體系結構而異。

您不應該捕獲信號並將代碼寫入管道。 這既不必要也不安全。

讓我引用你所鏈接的問題的答案,指出為什么它不是故障保護: “是什么讓你覺得SEGV還沒有破壞你的程序記憶”

現在你可能想知道如何做得更好,為什么我說它是“不必要的”。

可以使用WIFSIGNALED()檢查waitpid系統調用的返回碼,以確定進程是正常終止還是通過信號終止, WTERMSIG()將返回信號編號。

這是故障安全的它不需要處理程序或管道。 此外,您無需擔心要捕獲的內容,因為它會報告終止您的過程的每個信號。

這取決於:無論你喜歡什么信號,如果有用的話告訴用戶發生了一些不好的事情。 但無法捕獲SIGKILL和SIGSTOP。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM