【Linux系統程式設計】Linux訊號列表
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訊號列表
相關文章
- Linux系統程式設計:訊號捕捉Linux程式設計
- Linux系統程式設計—訊號捕捉Linux程式設計
- 【linux】系統程式設計-1-程式、管道和訊號Linux程式設計
- Linux系統程式設計之訊號中斷處理(下)Linux程式設計
- Linux系統程式設計之訊號中斷處理(上)Linux程式設計
- 【Linux】Linux系統程式設計入門Linux程式設計
- 【Linux網路程式設計-1】訊號Linux程式設計
- 【linux】系統程式設計-2-訊息佇列Linux程式設計佇列
- Linux系統程式設計—有名管道Linux程式設計
- Linux系統程式設計基礎Linux程式設計
- Linux系統程式設計入門Linux程式設計
- Linux系統程式設計之程式間通訊方式:管道(二)Linux程式設計
- Linux系統程式設計之程式間通訊方式:管道(一)Linux程式設計
- Linux系統程式設計之程式間通訊方式:訊息佇列Linux程式設計佇列
- Linux系統程式設計【4】——檔案系統Linux程式設計
- 【Linux】關於Linux的系統程式設計總結Linux程式設計
- 【linux】系統程式設計-6-POSIX標準下的訊號量與互斥鎖Linux程式設計
- Linux系統程式設計之程式介紹Linux程式設計
- Linux系統程式設計:mmap使用技巧Linux程式設計
- Linux系統程式設計之匿名管道Linux程式設計
- Linux系統程式設計-檔案IOLinux程式設計
- Linux系統程式設計之程式間通訊方式:命名管道(二)Linux程式設計
- Linux系統程式設計之程式間通訊方式:命名管道(一)Linux程式設計
- Linux系統程式設計——特殊程式之孤兒程式Linux程式設計
- Linux系統——程式設計師跳槽必備Linux程式設計師
- Linux作業系統之Shell程式設計Linux作業系統程式設計
- Linux系統程式設計之檔案IOLinux程式設計
- linux系統程式設計CP小測試Linux程式設計
- 《Linux系統程式設計訓練營》9_Linux 程式層次分析Linux程式設計
- 《Linux系統程式設計訓練營》8_Linux 終端與程式Linux程式設計
- linux系統指令碼中trap訊號都有哪些?Linux運維Linux指令碼運維
- 【Linux系統程式設計】libevent庫bufferevent與evconnlistenerLinux程式設計
- Linux系統程式設計【5】——stty的學習Linux程式設計
- Linux系統程式設計【3.1】——編寫ls命令Linux程式設計
- 【linux】系統程式設計-5-執行緒Linux程式設計執行緒
- Linux系統程式設計(七)檔案許可權系統呼叫Linux程式設計
- Linux系統程式設計—共享記憶體之mmapLinux程式設計記憶體
- 黑馬程式設計師Linux系統開發視訊之VIM使用教程程式設計師Linux