Unix環境高級編程(九)信號
信號時軟中斷,很多比較重要的應用程序都需要處理信號,信號提供了一種處理異步事件的方法。每個信號都一個名字,以SIG開頭,在<signal.h>頭文件中定義信號類型,都是正整數(信號編號)。
產生信號的條件:
(1)當用戶按某些終端鍵時,引發終端產生的信號。
(2)硬件異常產生信號。
(3)進程調用kill函數將信號發送給另外一個進程或進程組。
(4)用戶用kill命令將信號發送給其他進程。
(5)檢測到某種軟件條件已經發送,並將其通知有關進程時候產生信號。
內核在信號出現時候處理方式有:(1)忽略此信號,(2)鋪捉信號,(3)執行系統默認動作。
Unix系統信號如下:
其中SIGKILL和SIGSTOP信號時不能忽略和捕獲的,執行默認動作。
Signal |
Description |
SIGABRT |
由調用abort函數產生,進程非正常退出 |
SIGALRM |
用alarm函數設置的timer超時或setitimer函數設置的interval timer超時 |
SIGBUS |
某種特定的硬件異常,通常由內存訪問引起 |
SIGCANCEL |
由Solaris Thread Library內部使用,通常不會使用 |
SIGCHLD |
進程Terminate或Stop的時候,SIGCHLD會發送給它的父進程。缺省情況下該Signal會被忽略 |
SIGCONT |
當被stop的進程恢復運行的時候,自動發送 |
SIGEMT |
和實現相關的硬件異常 |
SIGFPE |
數學相關的異常,如被0除,浮點溢出,等等 |
SIGFREEZE |
Solaris專用,Hiberate或者Suspended時候發送 |
SIGHUP |
發送給具有Terminal的Controlling Process,當terminal被disconnect時候發送 |
SIGILL |
非法指令異常 |
SIGINFO |
BSD signal。由Status Key產生,通常是CTRL+T。發送給所有Foreground Group的進程 |
SIGINT |
由Interrupt Key產生,通常是CTRL+C或者DELETE。發送給所有ForeGround Group的進程 |
SIGIO |
異步IO事件 |
SIGIOT |
實現相關的硬件異常,一般對應SIGABRT |
SIGKILL |
無法處理和忽略。中止某個進程 |
SIGLWP |
由Solaris Thread Libray內部使用 |
SIGPIPE |
在reader中止之後寫Pipe的時候發送 |
SIGPOLL |
當某個事件發送給Pollable Device的時候發送 |
SIGPROF |
Setitimer指定的Profiling Interval Timer所產生 |
SIGPWR |
和系統相關。和UPS相關。 |
SIGQUIT |
輸入Quit Key的時候(CTRL+/)發送給所有Foreground Group的進程 |
SIGSEGV |
非法內存訪問 |
SIGSTKFLT |
Linux專用,數學協處理器的棧異常 |
SIGSTOP |
中止進程。無法處理和忽略。 |
SIGSYS |
非法系統調用 |
SIGTERM |
請求中止進程,kill命令缺省發送 |
SIGTHAW |
Solaris專用,從Suspend恢復時候發送 |
SIGTRAP |
實現相關的硬件異常。一般是調試異常 |
SIGTSTP |
Suspend Key,一般是Ctrl+Z。發送給所有Foreground Group的進程 |
SIGTTIN |
當Background Group的進程嘗試讀取Terminal的時候發送 |
SIGTTOU |
當Background Group的進程嘗試寫Terminal的時候發送 |
SIGURG |
當out-of-band data接收的時候可能發送 |
SIGUSR1 |
用戶自定義signal 1 |
SIGUSR2 |
用戶自定義signal 2 |
SIGVTALRM |
setitimer函數設置的Virtual Interval Timer超時的時候 |
SIGWAITING |
Solaris Thread Library內部實現專用 |
SIGWINCH |
當Terminal的窗口大小改變的時候,發送給Foreground Group的所有進程 |
SIGXCPU |
當CPU時間限制超時的時候 |
SIGXFSZ |
進程超過文件大小限制 |
SIGXRES |
Solaris專用,進程超過資源限制的時候發送 |
Unix環境高級編程(九)信號