[英]Which “fatal” signals should a user-level program catch?
首先, 我知道過去有類似的問題 。
但這個問題沒有得到妥善回答。 相反,它轉而建議如何捕捉信號。
所以只是為了澄清:我已經完成了處理信號所需要做的一切。 我有一個應用程序,它通過管道分配監視主進程的守護進程。 如果主進程崩潰(例如分段錯誤),它有一個信號處理程序,它將所有必需的信息寫入管道並中止。
目標是在應用程序發生不良事件時盡可能多地獲取信息,而不用處理“正常”操作,例如SIGHUP,SIGUSR1等。
所以我的問題是: 我應該抓住哪些信號? 我的意思是說,如果沒有我捕獲它們的信號會導致應用程序中止。
到目前為止,我已經提出以下列表:
kill <pid>
,可以是OutOfMemory的結果) 有人知道我是否錯過了什么? kill -l
有很多...... :)
我正在查看我的高級編程副本unix環境(Stevens)。 根據有關信號的部分中的表格,如果您沒有捕獲它們,則以下POSIX信號將默認終止該過程。 監控您不使用的所有這些並不是不合理的:
除了SIGKILL,你可以捕獲所有這些,但希望SIGKILL不會經常出現給你。
請注意,您的信號手冊頁( man 7 signal
)應該為您的系統提供正確的列表 - 這是POSIX列表,並且可能因您的體系結構而異。
您不應該捕獲信號並將代碼寫入管道。 這既不必要也不安全。
讓我引用你所鏈接的問題的答案,指出為什么它不是故障保護: “是什么讓你覺得SEGV還沒有破壞你的程序記憶”
現在你可能想知道如何做得更好,為什么我說它是“不必要的”。
可以使用WIFSIGNALED()
檢查waitpid
系統調用的返回碼,以確定進程是正常終止還是通過信號終止, WTERMSIG()
將返回信號編號。
這是故障安全的,它不需要處理程序或管道。 此外,您無需擔心要捕獲的內容,因為它會報告終止您的過程的每個信號。
這取決於:無論你喜歡什么信號,如果有用的話告訴用戶發生了一些不好的事情。 但無法捕獲SIGKILL和SIGSTOP。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.