Linux 應用程序開發和信號處理
目前,我的使用者抱怨我的應用程序終止時遇到問題。在某些(看似任意的)條件和桌面環境下,應用程序不會終止,並且設置不會在重新啟動時保存。我在相關的 irc 頻道中詢問過,大多數時候我被告知要正確處理信號。我知道終端中 Ctrl-C 的 SIGINT 和“正常”終止的 SIGTERM 。但有人告訴我 SIGHUP 也很重要。所以我的問題是:
我必須處理哪些信號才能建構一個表現良好的應用程序?
https://en.wikipedia.org/wiki/Unix_signal
有一個標准信號列表及其預設操作。任何具有足夠特權的程序總是可以向您發送任何信號,但程序(或您,通過程序)不應該這樣做。
除非您知道目標處理您要發送的特殊信號,否則您應該只
kill
使用並期望您的程序kill
使用TERM和可以由您的環境(shell、終端驅動程序)生成的一堆信號。您可以按其操作對基本信號進行排序。
核心轉儲信號
ABRT TRAP SYS BUS FPE ILL SEGV XFSZ XCPU QUIT
由您(TRAP、ABRT、SYS)使用一些專門的函式生成,或者由您進入硬錯誤狀態(BUS、FPE、ILL、SEGV)生成。
QUIT
由終端上的使用者想要核心轉儲 (C+\
) 生成。您可能希望將它們保留為預設配置。
在終止信號中:
HUP INT PIPE TERM ALRM POLL PROF USR1 USR2
你應該期待
HUP INT PIPE TERM
從您的環境在各種情況下:
HUP -- when the terminal hungs up or you become a stopped orphaned process INT -- when the user at the terminal interrupts you with C-c PIPE -- when a PIPE or socket you write into closes, e.g. by exiting before you finished writing to it (`yourprogram | (exit)` will give you a `PIPE` if yourprogram attempts to write to its STDOUT) TERM -- when a process ends you a normal termination request
只有您自己設置後,您才能收到其餘的終止信號。
殺死和停止你無能為力。
您可能希望攔截終端生成的停止信號:
TTIN -- you read from the terminal and you're a backgrounded process TTOU -- you write the terminal when you're a backgrounded process and the terminal is set to put you to sleep when you do TSTP -- you're being put to sleep with `C-Z`
但在最壞的情況下,這些只會停止你的程序,而不會破壞你的狀態。
除非你知道你需要處理
CHLD
,CONT
或URG
, 否則你不需要。TL; 博士:
基本上,如果您通常想要進行一些退出前清理,我認為應該處理(或忽略)HUP、INT、PIPE 和 TERM。其餘的可以不用管,除非您的程序使用這些信號,或者除非您在所有情況下都絕對需要進行一些清理。
在後一種情況下,您可以空白地阻止所有未處理的信號,但請注意,信號阻止遮罩會在 fork 和 execve 呼叫中繼承,並忽略或阻止像 ILL 這樣的信號,如果它們來自您的程序的執行並且沒有發送給您通過 kill 或 sigqueue 會給你未定義的行為。
如果您想深入了解它,請瀏覽手冊頁和標準。信號在 Unix 上是一個相當大的話題,處理它們會變得非常棘手。