信號是軟中斷,它提供了一種處理異步事件的方法。
首先,每個信號都有一個名字。這些名字都以三個字符SIG開頭。
在頭文件<signal.h>中,這些信號都被定義為正整數(信號編號)。
實際上,實現將各信號定義在另一個頭文件中,但是該頭文件又包括在<signal.h>中。通常,若應用程序和內核兩者都需使用同一定義,那么就將有關信息放置在內核頭文件中,然后用戶級頭文件再包括該內核頭文件。
不存在編號為0的信號。(kill函數對信號編號0有特殊的應用。POSIX.1將此種信號編號值稱為空信號。)
產生信號的條件:
信號是異步事件的經典實例。產生信號的事件對進程而言是隨機出現的。進程不能簡單地測試一個變量(例如errno)來判別是否出現了一個信號,而是必須告訴內核“在此信號出現時,請執行下列操作”。
可以要求內核在某個信號出現時按照下列三種方式之一進行處理,我們稱之為信號的處理或者與信號相關的動作。
(1)忽略此信號。大多數信號都可使用這種方法進行處理,但是有兩種信號決不能被忽略:SIGKILL和SIGSTOP。這兩種信號不能被忽略的原因是:它們向超級用戶提供了使進程終止或停止的可靠方法。另外,如果忽略某些由硬件異常產生的信號(例如除以0),則進程的運行行為是未定義的。
(2)捕捉信號。為了做到這一點,要通知內核在某種信號發生時調用一個用戶函數。在用戶函數中,可執行用戶希望對這種事件進行的處理。注意,不能捕捉SIGKILL和SIGSTOP信號。
(3)執行系統默認動作。注意,針對大多數信號的系統默認動作是終止進程。
表10-1列出了所有信號的名字,說明了哪些系統支持此信號以及針對這些信號的系統默認動作。在“默認動作”列中,“終止+core”表示在進程當前工作目錄的core文件中復制該進程的存儲映像。大多數UNIX調試程序都使用core文件以檢查進程終止時的狀態。
表10-1 UNIX系統信號
UNIX系統信號:
Signal Description
SIGABRT 調用abort函數產生此信號,進程異常終止
SIGALRM 用alarm函數設置的計時器超時或setitimer函數設置的間隔時間超時
SIGBUS 某種特定的硬件異常,通常由內存訪問引起
SIGCANCEL 由Solaris 線程庫內部使用,它不供一般使用
SIGCHLD 進程終止或停止的時候,SIGCHLD會發送給它的父進程。缺省情況下該信號會被忽略。如果父進程希望被告知其子進程的這種狀態改變,則應捕捉此信號,信號捕捉函數中通常要調用一種wait函數以取得子進程ID和其終止狀態。
SIGCONT 此作業控制信號被發送給需要繼續運行,但當前處于停止狀態的進程。如果接收到此信號的進程處于停止狀態,則系統默認動作是使該進程繼續運行,否則默認動作是忽略此信號。
SIGEMT 和實現相關的硬件異常
SIGFPE 此信號表示一個算術運算異常,如被0除,浮點溢出,等等
SIGFREEZE Solaris專用,它用于通知進程在凍結系統狀態之前需要采取特定動作。
SIGHUP 如果終端接口檢測到一個連接斷開,則將此信號發送給與該終端相關的控制進程(會話首進程)。注意,接收到此信號的會話首進程可能在后臺。如果會話首進程終止,則也產生此信號。在這種情況下,此信號被發送給前臺進程組中的每一個進程。
SIGILL 此信號指示進程已執行一條非法硬件指令。
SIGINFO BSD signal。當用戶按狀態鍵(一般采用Ctrl+T)時,終端驅動程序產生此信號并送至前臺進程組中的每一個進程。此信號通常導致在終端上顯示前臺進程組中個進程的狀態信息。
SIGINT 由Interrupt Key產生,通常是CTRL+C或者DELETE。發送給所有ForeGround Group的進程
SIGIO 異步IO事件
SIGIOT 實現相關的硬件異常,一般對應SIGABRT
SIGKILL 無法捕捉和忽略。它向系統管理員提供了一種可以殺死任一進程的可靠方法。
SIGLWP 由Solaris Thread Libray內部使用,并不作一般使用
SIGPIPE 如果在寫管道時讀進程已終止,則產生此信號。當類型為SOCK_STREAM的套接字已不再連接時,進程寫到該套接字也產生此信號。
SIGPOLL 當在一個可輪詢設備上發生一特定事件時產生此信號。
SIGPROF 當setitimer(2)函數設置的梗概統計間隔計時器(profiling interval timer)已到期時產生此信號。
SIGPWR 和系統相關。和UPS相關。
SIGQUIT 輸入Quit Key的時候(CTRL+/)發送給所有Foreground Group的進程
SIGSEGV 非法內存訪問(SEGV,segmentation violation,段違例)
SIGSTKFLT linux專用,數學協處理器的棧異常
SIGSTOP 停止一個進程。無法捕捉和忽略。
SIGSYS 無效的系統調用
SIGTERM 這是由kill(1)命令發送的系統默認終止信號。
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環境高級編程》(第二版),僅作個人學習記錄所用。關于本書可參考:http://www.apuebook.com/。
新聞熱點
疑難解答