信號是軟中斷,信號提供了一種異步處理事件的方法
概念
信號都被定義爲正整數常量,在頭文件signal.h中定義.
不存在編號爲0的信號信號產生
- 用戶按某些終端鍵時,引發終端產生的信號。(ctrl+c產生SIGINT信號)
- 硬件異常產生信號(除數爲0,無效的內存訪問(產生SIGSEGV信號)等),這些條件有硬件檢測到,並通知內核。然後內核爲該條件發生時正在運行的進程產生適當的信號。
- 進程調用kill函數可以將任意信號發送給另一個進程或進程組。(接收信號的進程和發送信號的進程的所有者必須相同,或發送信號進程的所有者必須是超級用戶)
- kill命令發送信號,常用於終止一個失去控制的後臺進程
- 當檢測到某種軟件條件已經發生,並應將其通知有關進程時也產生信號。(如:SIGURG:在網絡連接上傳來帶外的數據;SIGPIPE:(在管道的讀進程終止後,一個進程寫此管道);SIGALARM:(進程所設置的定時器已經超時))
信號產生時的處理
- 忽略 大多數信號可使用這種方式處理,但有2種信號不允許忽略處理(SIGKILL和SIGSTOP)
- 執行系統默認動作 大多數信號的系統默認動作是終止進程
- 捕捉處理 SIGKILL和SIGSTOP不能被捕捉
信號列舉
信號 | 說明 | 描述 | 默認動作 |
---|---|---|---|
SIGABRT | 異常終止(abort) | 調用abort()函數,進程異常終止 | 終止+core |
SIGALRM | 定時器超時(alarm) | alarm()函數或者setitimer()函數超時 | 終止 |
SIGBUS | 硬件故障 | 終止+core | |
SIGCANCEL | 線程庫內部使用 | 忽略(linux無此信號) | |
SIGCHLD | 子進程狀態改變 | 忽略 | |
SIGCONT | 使暫停進程繼續 | 繼續/忽略 | |
SIGEMT | 硬件故障 | 終止+core | |
SIGFPE | 算術異常 | 終止+core | |
SIGHUP | 連接點斷開 | 終止 | |
SIGILL | 非法硬件指令 | 終止+core | |
SIGINT | 終端終端符 | 終止 | |
SIGIO | 異步IO | 終止/忽略 | |
SIGIOT | 硬件故障 | 終止+core | |
SIGKILL | 終止 | 終止 | |
SIGPIPE | 寫至無讀進程的管道 | 終止 | |
SIGPOLL | 可輪詢事件(poll) | 終止 | |
SIGPROF | 梗概時間超時(setitimer) | 終止 | |
SIGPWR | 電源失效/重啓 | 終止/忽略 | |
SIGQUIT | 終端退出符 | 終止+core | |
SIGSEGV | 無效內存訪問 | 終止+core | |
SIGSTKFLT | 協處理器棧故障 | 終止+core | |
SITSTOP | 停止 | 停止進程 | |
SIGSYS | 無效系統調用 | 終止+core | |
SIGTERM | 終止 | 終止 | |
SIGTRAP | 硬件故障 | 終止+core | |
SIGTSTP | 終端停止符 | 停止進程 | |
SIGTTIN | 後臺讀控制tty | 停止進程 | |
SIGTTOU | 後臺寫向控制tty | 停止進程 | |
SIGURG | 緊急情況(套接字) | 忽略 | |
SIGUSR1 | 用戶定義信號 | 終止 | |
SIGUSR2 | 用戶定義信號 | 終止 | |
SIGVTALRM | 虛擬時間鬧鐘 | 終止 | |
SIGWINCH | 窗口大小改變 | 忽略 | |
SIGXCPU | 超過cpu限制(setrlimit) | 終止+core | |
SIGXFSZ | 超過文件長度限制(setrlimit) | 終止+core | |
SIGXRES | 超過資源限制 | 忽略 |