1. 信號是軟件中斷:
信號提供了一種處理異步事件的方法. 每個信號都有一個名字, 他們以SIG開頭, 如SIGALRM是鬧鐘信號, 當(dāng)由alarm函數(shù)設(shè)置的計時器超時后產(chǎn)生此信號, 然后由SIGALRM的信號處理函數(shù)接管處理, 處理之后返回調(diào)用alarm函數(shù)的應(yīng)用程序中.
2. 信號編號:
在頭文件<signal.h>中, 信號都用宏定義為正整數(shù)的信號編號, 不存在編號為0的信號, kill函數(shù)對編號為0的信號有特殊的作用. POSIX.1將編號為0的信號定義為空信號, 如果kill中的signo參數(shù)為0, 則kill仍執(zhí)行正常的錯誤檢查, 但不發(fā)送信號. 這常被用來通過kill的返回值確定一個特定進程是否存在.
3. 不可忽略/捕捉的信號:
大多數(shù)信號都可以通過忽略進行處理, 但SIGKILL和SIGSTOP這兩個信號不能被忽略. 因為它們是向超級用戶提供使進程終止或停止的可靠方法. 另外, 如果忽略某些硬件異常產(chǎn)生的信號(例如非法內(nèi)存引用或除0), 則進程的行為是未定義的.
4. 介紹幾個常見信號:
SIGINT: 當(dāng)用戶按某些終端鍵時, 引發(fā)終端產(chǎn)生的信號. 如Ctrl+C鍵, 這將產(chǎn)生中斷信號(SIGINT). 它將停止一個已失去控制的程序.
SIGSEGV: 由硬件異常(除數(shù)為0, 無效的內(nèi)存引用等等)產(chǎn)生的信號. 這些條件通常由硬件檢測到, 并將其通知內(nèi)核. 然后內(nèi)核為該條件發(fā)生時正在運行的進程產(chǎn)生該信號.
SIGURG: 在網(wǎng)絡(luò)連接上傳來帶外數(shù)據(jù)時產(chǎn)生.
SIGPIPE: 在管道的讀進程已終止后, 一個進程寫此管道時產(chǎn)生. 當(dāng)類型為SOCK_STREAM的socket已不再連接時, 進程寫到該socket也產(chǎn)生此信號.
SIGALRM: 進程所設(shè)置的鬧鐘時鐘超時的時候產(chǎn)生.
SIGABRT: 進程調(diào)用abort函數(shù)時產(chǎn)生此信號, 進程異常終止.
SIGCHLD: 在一個進程終止或停止時, 它將把該信號發(fā)送給其父進程. 按系統(tǒng)默認(rèn), 將忽略此信號. 如果父進程希望被告知其子進程的這種狀態(tài)改變, 則應(yīng)該捕捉此信號. 通常是用wait系列函數(shù)捕捉, 如果不wait的話, 子進程將成為一個僵尸進程.
SIGIO: 此信號指示一個異步I/O事件.
SIGSYS: 該信號指示一個無效的系統(tǒng)調(diào)用.
SIGTSTP: 交互式停止信號. Ctrl+Z, 按下時, 終端將產(chǎn)生此信號, 進程被掛起.