C

Linux 應用程序開發和信號處理

  • August 30, 2016

目前,我的使用者抱怨我的應用程序終止時遇到問題。在某些(看似任意的)條件和桌面環境下,應用程序不會終止,並且設置不會在重新啟動時保存。我在相關的 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,CONTURG, 否則你不需要。

TL; 博士:

基本上,如果您通常想要進行一些退出前清理,我認為應該處理(或忽略)HUP、INT、PIPE 和 TERM。其餘的可以不用管,除非您的程序使用這些信號,或者除非您在所有情況下都絕對需要進行一些清理。

在後一種情況下,您可以空白地阻止所有未處理的信號,但請注意,信號阻止遮罩會在 fork 和 execve 呼叫中繼承,並忽略或阻止像 ILL 這樣的信號,如果它們來自您的程序的執行並且沒有發送給您通過 kill 或 sigqueue 會給你未定義的行為。

如果您想深入了解它,請瀏覽手冊頁和標準。信號在 Unix 上是一個相當大的話題,處理它們會變得非常棘手。

引用自:https://unix.stackexchange.com/questions/284140