Linux Signal (1): 基本概念

1. 信號是軟件中斷:

信號提供了一種處理異步事件的方法. 每個信號都有一個名字, 他們以SIG開頭, 如SIGALRM是鬧鐘信號, 當由alarm函數設置的計時器超時後產生此信號, 然後由SIGALRM的信號處理函數接管處理, 處理之後返回調用alarm函數的應用程序中.

2. 信號編號:

在頭文件<signal.h>中, 信號都用宏定義爲正整數的信號編號, 不存在編號爲0的信號, kill函數對編號爲0的信號有特殊的作用. POSIX.1將編號爲0的信號定義爲空信號, 如果kill中的signo參數爲0, 則kill仍執行正常的錯誤檢查, 但不發送信號. 這常被用來通過kill的返回值確定一個特定進程是否存在.

3. 不可忽略/捕捉的信號:

大多數信號都可以通過忽略進行處理, 但SIGKILL和SIGSTOP這兩個信號不能被忽略. 因爲它們是向超級用戶提供使進程終止或停止的可靠方法. 另外, 如果忽略某些硬件異常產生的信號(例如非法內存引用或除0), 則進程的行爲是未定義的.

4. 介紹幾個常見信號:

SIGINT: 當用戶按某些終端鍵時, 引發終端產生的信號. 如Ctrl+C鍵, 這將產生中斷信號(SIGINT). 它將停止一個已失去控制的程序.

SIGSEGV: 由硬件異常(除數爲0, 無效的內存引用等等)產生的信號. 這些條件通常由硬件檢測到, 並將其通知內核. 然後內核爲該條件發生時正在運行的進程產生該信號.

SIGURG: 在網絡連接上傳來帶外數據時產生.

SIGPIPE: 在管道的讀進程已終止後, 一個進程寫此管道時產生. 當類型爲SOCK_STREAM的socket已不再連接時, 進程寫到該socket也產生此信號.

SIGALRM: 進程所設置的鬧鐘時鐘超時的時候產生.

SIGABRT: 進程調用abort函數時產生此信號, 進程異常終止.

SIGCHLD: 在一個進程終止或停止時, 它將把該信號發送給其父進程. 按系統默認, 將忽略此信號. 如果父進程希望被告知其子進程的這種狀態改變, 則應該捕捉此信號. 通常是用wait系列函數捕捉, 如果不wait的話, 子進程將成爲一個殭屍進程.

SIGIO: 此信號指示一個異步I/O事件.

SIGSYS: 該信號指示一個無效的系統調用.

SIGTSTP: 交互式停止信號. Ctrl+Z, 按下時, 終端將產生此信號, 進程被掛起.

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章