一.信號列表
$ 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 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
(1)
1 ~ 31的信號為傳統(tǒng)UNIX支持的信號,是不可靠信號(非實時的)
(2)
32 ~ 63的信號是后來擴充的,稱做可靠信號(實時信號)。不可靠信號和可靠信號的區(qū)別在于前者不支持排隊,可能會造成信號丟失,而后者不會。二.具體每個信號的產生原因
1) SIGHUP:當用戶退出shell時,由該shell啟動的所有進程將收到這個信號,默認動作為終止進程
本信號在用戶終端連接(正常或非正常)結束時發(fā)出, 通常是在終端的控制進程結束時, 通知同一session內的各個作業(yè), 這時它們與控制終端不再關聯(lián)。
登錄Linux時,系統(tǒng)會分配給登錄用戶一個終端(Session)。在這個終端運行的所有程序,包括前臺進程組和后臺進程組,一般都屬于這個Session。當用戶退出Linux登錄時,前臺進程組和后臺有對終端輸出的進程將會收到SIGHUP信號。這個信號的默認操作為終止進程,因此前臺進程組和后臺有終端輸出的進程就會中止。不過可以捕獲這個信號,比如wget能捕獲SIGHUP信號,并忽略它,這樣就算退出了Linux登錄,wget也能繼續(xù)下載。
此外,對于與終端脫離關系的守護進程,這個信號用于通知它重新讀取配置文件。
2)SIGINT:當用戶按下了<Ctrl+C>組合鍵時,用戶終端向正在運行中的由該終端啟動的程序發(fā)出此信號。默認動
作為終止里程。
3)SIGQUIT:當用戶按下<ctrl+\>組合鍵時產生該信號,用戶終端向正在運行中的由該終端啟動的程序發(fā)出些信
號。默認動作為終止進程。進程在因收到SIGQUIT退出時會產生core文件, 在這個意義上類似于一個程序錯誤信號。
4)SIGILL:CPU檢測到某進程執(zhí)行了非法指令。默認動作為終止進程并產生core文件
執(zhí)行了非法指令. 通常是因為可執(zhí)行文件本身出現(xiàn)錯誤, 或者試圖執(zhí)行數(shù)據段. 堆棧溢出時也有可能產生這個信號。
5)SIGTRAP:該信號由斷點指令或其他 trap指令產生。默認動作為終止里程 并產生core文件。
由斷點指令或其它trap指令產生. 由debugger使用。
6 ) SIGABRT:調用abort函數(shù)時產生該信號。默認動作為終止進程并產生core文件。
7)SIGBUS:非法訪問內存地址,包括內存對齊出錯,默認動作為終止進程并產生core文件。
非法地址, 包括內存地址對齊(alignment)出錯。比如訪問一個四個字長的整數(shù), 但其地址不是4的倍數(shù)。它與SIGSEGV的區(qū)別在于后者是由于對合法存儲地址的非法訪問觸發(fā)的(如訪問不屬于自己存儲空間或只讀存儲空間)。
8)SIGFPE:在發(fā)生致命的運算錯誤時發(fā)出。不僅包括浮點運算錯誤,還包括溢出及除數(shù)為0等所有的算法錯誤。默
認動作為終止進程并產生core文件。
9)SIGKILL:無條件終止進程。本信號不能被忽略,處理和阻塞。默認動作為終止進程。它向系統(tǒng)管理員提供了可
以殺死任何進程的方法。
10)SIGUSE1:用戶定義 的信號。即程序員可以在程序中定義并使用該信號。默認動作為終止進程。
11)SIGSEGV:指示進程進行了無效內存訪問。默認動作為終止進程并產生core文件。
試圖訪問未分配給自己的內存, 或試圖往沒有寫權限的內存地址寫數(shù)據
12)SIGUSR2:這是另外一個用戶自定義信號 ,程序員可以在程序中定義 并使用該信號。默認動作為終止進程。
13)SIGPIPE:Broken pipe向一個沒有讀端的管道寫數(shù)據。默認動作為終止進程。
14) SIGALRM:定時器超時,超時的時間 由系統(tǒng)調用alarm設置。默認動作為終止進程。
時鐘定時信號, 計算的是實際的時間或時鐘時間. alarm函數(shù)使用該信號.
15)SIGTERM:程序結束信號,與SIGKILL不同的是,該信號可以被阻塞和終止。通常用來要示程序正常退出。執(zhí)行
shell命令Kill時,缺省產生這個信號。默認動作為終止進程。
程序結束(terminate)信號, 與SIGKILL不同的是該信號可以被阻塞和處理。通常用來要求程序自己正常退出,shell命令kill缺省產生這個信號。如果進程終止不了,我們才會嘗試SIGKILL。
17)SIGCHLD:子進程結束時,父進程會收到這個信號。默認動作為忽略這個信號。
子進程結束時, 父進程會收到這個信號。
如果父進程沒有處理這個信號,也沒有等待(wait)子進程,子進程雖然終止,但是還會在內核進程表中占有表項,這時的子進程稱為僵尸進程。這種情況我們應該避免(父進程或者忽略SIGCHILD信號,或者捕捉它,或者wait它派生的子進程,或者父進程先終止,這時子進程的終止自動由init進程來接管)。
18)SIGCONT:停止進程的執(zhí)行。信號不能被忽略,處理和阻塞。默認動作為終止進程。
讓一個停止(stopped)的進程繼續(xù)執(zhí)行. 本信號不能被阻塞. 可以用一個handler來讓程序在由stopped狀態(tài)變?yōu)槔^續(xù)執(zhí)行時完成特定的工作. 例如, 重新顯示提示符
19)
SIGSTOP停止(stopped)進程的執(zhí)行. 注意它和terminate以及interrupt的區(qū)別:該進程還未結束, 只是暫停執(zhí)行. 本信號不能被阻塞, 處理或忽略.
20)SIGTSTP:停止進程的運行。按下<ctrl+z>組合鍵時發(fā)出這個信號。默認動作為暫停進程。
停止進程的運行, 但該信號可以被處理和忽略. 用戶鍵入SUSP字符時(通常是Ctrl-Z)發(fā)出這個信號
21)SIGTTIN:后臺進程讀終端控制臺。默認動作為暫停進程。
當后臺作業(yè)要從用戶終端讀數(shù)據時, 該作業(yè)中的所有進程會收到SIGTTIN信號. 缺省時這些進程會停止執(zhí)行.
22)SIGTTOU:該信號類似于SIGTTIN,在后臺進程要向終端輸出數(shù)據時發(fā)生。默認動作為暫停進程。
類似于SIGTTIN, 但在寫終端(或修改終端模式)時收到.
23)SIGURG:套接字上有緊急數(shù)據時,向當前正在運行的進程發(fā)出些信號,報告有緊急數(shù)據到達。如網絡帶外數(shù)據
到達,默認動作為忽略該信號。
有"緊急"數(shù)據或out-of-band數(shù)據到達socket時產生.
24)SIGXCPU:進程執(zhí)行時間超過了分配給該進程的CPU時間 ,系統(tǒng)產生該信號并發(fā)送給該進程。默認動作為終止
進程。
超過CPU時間資源限制. 這個限制可以由getrlimit/setrlimit來讀取/改變
25)SIGXFSZ:超過文件的最大長度設置。默認動作為終止進程。
當進程企圖擴大文件以至于超過文件大小資源限制。
26)SIGVTALRM:虛擬時鐘超時時產生該信號。類似于SIGALRM,但是該信號只計算該進程占用CPU的使用時間。默
認動作為終止進程。
虛擬時鐘信號. 類似于SIGALRM, 但是計算的是該進程占用的CPU時間.
27)SGIPROF:類似于SIGVTALRM,它不公包括該進程占用CPU時間還包括執(zhí)行系統(tǒng)調用時間。默認動作為終止進
程。
包括該進程用的CPU時間以及系統(tǒng)調用的時間
28)SIGWINCH:窗口變化大小時發(fā)出。默認動作為忽略該信號。
29)SIGIO:此信號向進程指示發(fā)出了一個異步IO事件。默認動作為忽略。
文件描述符準備就緒, 可以開始進行輸入/輸出操作
30)SIGPWR:關機。默認動作為終止進程。
31)SIGSYS:無效的系統(tǒng)調用。默認動作為終止進程并產生core文件。
32)SIGRTMIN~(64)SIGRTMAX:LINUX的實時信號,它們沒有固定的含義(可以由用戶自定義)。
所有的實時信號的默認動作都為終止進程。 在以上列出的信號中,程序不可捕獲、阻塞或忽略的信號有: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在進程掛起時是繼續(xù),否則是忽略,不能被阻塞。