【Linux系統程式設計】Linux訊號列表

滄海一笑-dj發表於2020-01-28

00. 目錄

01. Linux訊號編號

在 Linux 下,每個訊號的名字都以字元 SIG 開頭,每個訊號和一個數字編碼相對應,在標頭檔案 signum.h 中,這些訊號都被定義為正整數。訊號名定義路徑:/usr/include/i386-linux-gnu/bits/signum.h

要想檢視這些訊號和編碼的對應關係,可使用命令:kill -l

deng@itcast:/mnt/hgfs/LinuxHome/code.bak2$ kill -l
 1) SIGHUP       2) SIGINT       3) SIGQUIT      4) SIGILL       5) SIGTRAP
 6) SIGABRT      7) SIGBUS       8) SIGFPE       9) SIGKILL     10) SIGUSR1
11) SIGSEGV     12) SIGUSR2     13) SIGPIPE     14) SIGALRM     15) SIGTERM
16) SIGSTKFLT   17) SIGCHLD     18) SIGCONT     19) SIGSTOP     20) SIGTSTP
21) SIGTTIN     22) SIGTTOU     23) SIGURG      24) SIGXCPU     25) SIGXFSZ
26) SIGVTALRM   27) SIGPROF     28) SIGWINCH    29) SIGIO       30) SIGPWR
31) SIGSYS      34) SIGRTMIN    35) SIGRTMIN+1  36) SIGRTMIN+2  37) SIGRTMIN+3
38) SIGRTMIN+4  39) SIGRTMIN+5  40) SIGRTMIN+6  41) SIGRTMIN+7  42) SIGRTMIN+8
43) SIGRTMIN+9  44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12 47) SIGRTMIN+13
48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14 51) SIGRTMAX-13 52) SIGRTMAX-12
53) SIGRTMAX-11 54) SIGRTMAX-10 55) SIGRTMAX-9  56) SIGRTMAX-8  57) SIGRTMAX-7
58) SIGRTMAX-6  59) SIGRTMAX-5  60) SIGRTMAX-4  61) SIGRTMAX-3  62) SIGRTMAX-2
63) SIGRTMAX-1  64) SIGRTMAX
deng@itcast:/mnt/hgfs/LinuxHome/code.bak2$ 

列表中,編號為 1 ~ 31 的訊號為傳統 UNIX 支援的訊號,是不可靠訊號(非實時的),編號為 32 ~ 63 的訊號是後來擴充的,稱做可靠訊號(實時訊號)。不可靠訊號和可靠訊號的區別在於前者不支援排隊,可能會造成訊號丟失,而後者不會。

非可靠訊號一般都有確定的用途及含義, 可靠訊號則可以讓使用者自定義使用

02. 訊號簡介

下面我們對編號小於 SIGRTMIN 的訊號(編號為 1 ~ 31 的不可靠訊號)進行簡單介紹。

1) SIGHUP
本訊號在使用者終端連線(正常或非正常)結束時發出, 通常是在終端的控制程式結束時, 通知同一 session 內的各個作業, 這時它們與控制終端不再關聯。

登入 Linux 時,系統會分配給登入使用者一個終端( Session )。在這個終端執行的所有程式,包括前臺程式組和後臺程式組,一般都屬於這個 Session 。當使用者退出 Linux 登入時,前臺程式組和後臺有對終端輸出的程式將會收到 SIGHUP 訊號。這個訊號的預設操作為終止程式,因此前臺程式組和後臺有終端輸出的程式就會中止。不過可以捕獲這個訊號,比如 wget 能捕獲 SIGHUP 訊號,並忽略它,這樣就算退出了Linux 登入,wget 也能繼續下載。

此外,對於與終端脫離關係的守護程式,這個訊號用於通知它重新讀取配置檔案。

2) SIGINT
程式終止( interrupt )訊號, 在使用者鍵入 INTR 字元(通常是 Ctrl + C )時發出,用於通知前臺程式組終止程式。

3) SIGQUIT
和 SIGINT 類似, 但由 QUIT 字元(通常是 Ctrl + / )來控制. 程式在因收到 SIGQUIT 退出時會產生 core 檔案, 在這個意義上類似於一個程式錯誤訊號。

4) SIGILL
執行了非法指令. 通常是因為可執行檔案本身出現錯誤, 或者試圖執行資料段. 堆疊溢位時也有可能產生這個訊號。

5) SIGTRAP
由斷點指令或其它 trap 指令產生. 由d ebugger 使用。

6) SIGABRT
呼叫 abort 函式生成的訊號。

7) SIGBUS
非法地址, 包括記憶體地址對齊( alignment )出錯。比如訪問一個四個字長的整數, 但其地址不是 4 的倍數。它與 SIGSEGV 的區別在於後者是由於對合法儲存地址的非法訪問觸發的(如訪問不屬於自己儲存空間或只讀儲存空間)。

8) SIGFPE
在發生致命的算術運算錯誤時發出. 不僅包括浮點運算錯誤, 還包括溢位及除數為0等其它所有的算術的錯誤。

9) SIGKILL
用來立即結束程式的執行。本訊號不能被阻塞、處理和忽略。如果管理員發現某個程式終止不了,可嘗試傳送這個訊號。

10) SIGUSR1
留給使用者使用

11) SIGSEGV
試圖訪問未分配給自己的記憶體, 或試圖往沒有寫許可權的記憶體地址寫資料。

12) SIGUSR2
留給使用者使用

13) SIGPIPE
管道破裂。這個訊號通常在程式間通訊產生,比如採用 FIFO (管道)通訊的兩個程式,讀管道沒開啟或者意外終止就往管道寫,寫程式會收到 SIGPIPE 訊號。此外用Socket 通訊的兩個程式,寫程式在寫 Socket 的時候,讀程式已經終止。

14) SIGALRM
時鐘定時訊號, 計算的是實際的時間或時鐘時間。alarm 函式使用該訊號。

15) SIGTERM
程式結束( terminate )訊號, 與 SIGKILL 不同的是該訊號可以被阻塞和處理。通常用來要求程式自己正常退出,shell 命令 kill 預設產生這個訊號。如果程式終止不了,我們才會嘗試 SIGKILL。

17) SIGCHLD
子程式結束時, 父程式會收到這個訊號。

如果父程式沒有處理這個訊號,也沒有等待( wait )子程式,子程式雖然終止,但是還會在核心程式表中佔有表項,這時的子程式稱為殭屍程式。這種情況我們應該避免(父程式或者忽略 SIGCHILD 訊號,或者捕捉它,或者 wait 它派生的子程式,或者父程式先終止,這時子程式的終止自動由 init 程式來接管)。

18) SIGCONT
讓一個停止( stopped )的程式繼續執行。本訊號不能被阻塞。可以用一個 handler 來讓程式在由 stopped 狀態變為繼續執行時完成特定的工作。例如, 重新顯示提示符。

19) SIGSTOP
停止( stopped )程式的執行。注意它和 terminate 以及 interrupt 的區別:該程式還未結束, 只是暫停執行。本訊號不能被阻塞,處理或忽略。

20) SIGTSTP
停止程式的執行, 但該訊號可以被處理和忽略。使用者鍵入 SUSP 字元時(通常是 Ctrl + Z )發出這個訊號。

21) SIGTTIN
當後臺作業要從使用者終端讀資料時,該作業中的所有程式會收到 SIGTTIN 訊號。預設時這些程式會停止執行。

22) SIGTTOU
類似於 SIGTTIN,但在寫終端(或修改終端模式)時收到。

23) SIGURG
有“緊急”資料或 out-of-band 資料到達 socket 時產生。

24) SIGXCPU
超過 CPU 時間資源限制。這個限制可以由 getrlimit/setrlimit 來讀取/改變。

25) SIGXFSZ
當程式企圖擴大檔案以至於超過檔案大小資源限制。

26) SIGVTALRM
虛擬時鐘訊號。類似於 SIGALRM,但是計算的是該程式佔用的 CPU 時間。

27) SIGPROF
類似於 SIGALRM/SIGVTALRM,但包括該程式用的 CPU 時間以及系統呼叫的時間。

28) SIGWINCH
視窗大小改變時發出。

29) SIGIO
檔案描述符準備就緒,可以開始進行輸入/輸出操作。

30) SIGPWR
Power failure

31) SIGSYS
非法的系統呼叫。

03. 特殊訊號

在以上列出的訊號中,比較特殊的有:

  • 程式不可捕獲、阻塞或忽略的訊號有:SIGKILL,SIGSTOP
  • 不能恢復至預設動作的訊號有:SIGILL,SIGTRAP
  • 預設會導致程式流產的訊號有:SIGABRT,SIGBUS,SIGFPE,SIGILL,SIGIOT,SIGQUIT,SIGSEGV,SIGTRAP,SIGXCPU,SIGXFSZ
  • 預設會導致程式退出的訊號有:SIGALRM,SIGHUP,SIGINT,SIGKILL,SIGPIPE,SIGPOLL,SIGPROF,SIGSYS,SIGTERM,SIGUSR1,SIGUSR2,SIGVTALRM
  • 預設會導致程式停止的訊號有:SIGSTOP,SIGTSTP,SIGTTIN,SIGTTOU
  • 預設程式忽略的訊號有:SIGCHLD,SIGPWR,SIGURG,SIGWINCH
    此外,SIGIO 在 SVR4 是退出,在 4.3BSD 中是忽略;SIGCONT 在程式掛起時是繼續,否則是忽略,不能被阻塞。

04. 附錄

4.1 參考:Linux訊號列表

相關文章