[Linux] signal handler 應該要處理哪些 signal 呢?
之前曾經在專案的 C++ 程式中,用 signal handler 來對 crash 的狀況作些處理,
不過最近發現,只攔 SIGBUS 和 SIGSEGV 似乎不夠~
那為什麼一開始我只攔這兩個呢?
其實是因為當初專案程式造成的 crash dump,用 gdb 去看時,
就是由這兩種 signal 造成的 (但顯然在其他情況下,會有其他的 signal 出現)~
從 Linux Programmer’s Manual: signal 這邊可以看到所有的 signal,
而且有把預設動作列出來,因此是個蠻好的參考資料~
看了一下,預設動作是 Core (產生 core dump) 的有:
SIGQUIT (3) Core Quit from keyboard
SIGILL (4) Core Illegal Instruction
SIGTRAP (5) Core Trace/breakpoint trap
SIGABRT (6) Core Abort signal from abort(3)
SIGBUS (7) Core Bus error (bad memory access)
SIGFPE (8) Core Floating point exception
SIGSEGV (11) Core Invalid memory reference
SIGSYS (31) Core Bad argument to routine (SVr4)
不過並不是上面每一個 signal 都適合加到 signal handler 裡去,要視想要處理的東西而定~
像我們的 signal handler 是為了在程式在不預期狀況下 crash 的話,
可以記錄一下現在在處理的東西 (因為可能是這個東西導致我們程式當掉),
所以我們有興趣的就是那種程式出錯時可能會出現的 signal,
因此像 SIGQUIT 這種由使用者手動產生的 signal,或是 SIGTRAP 這種 debugger 使用的 signal,
就不適合加到我們的 signal handler 裡面去~
對這幾個 signal 有興趣的人,也可以再看看 Termination Signals 和 Program Error Signals 這兩篇,
對這幾種 signal 發生的可能原因有更清楚的描述~