信號的基本概念
1. 信號的概念
信號是Linux系統響應某些條件產生的一些事件。接收到信號的進程會相應地采取一些行動。
2. 信號的生成
信號是由于某些錯誤條件而生成的,如內存段沖突、浮點處理器錯誤或非法指令等。信號的生成其實就是一種軟件層次的中斷,信號由shell和終端處理器生成來引起中斷,信號還可以作為在進程間傳遞消息或修改行為的一種方式,明確地由一個進程發送給另一個進程。一個進程要么正常結束,要么就是某一個信號把這個進程中斷了。
3.信號的響應方式
信號產生之后,進程接收這個信號,然后做出一些響應,做出的響應有三種方式,默認方式、忽略和自定義。改變這三種響應方式要通過系統調用signal()。
與信號有關的系統調用在“signal.h”頭文件中有聲明。
4. 信號名稱的定義
信號的值在系統源碼中的定義如下,它們都以SIG開頭:
(1)#define SIGHUP 1
連接掛斷
(2)#define SIGINT 2
終端中斷,鍵盤按下Ctrl+c時,會產生該信號
(3)#define SIGQUIT 3
終端退出
(4)#define SIGILL 4
*非法指令
(5)#define SIGTRAP 5
由斷點指令或其它陷阱(trap)指令產生
(6)#define SIGABRT 6
調用abort函數生成的信號
(7)#define SIGIOT 6
建立CORE文件,執行I/O自陷
(8)#define SIGBUS 7
建立CORE文件,總線錯誤
(9)#define SIGFPE 8
建立CORE文件,浮點異常
(10)#define SIGKILL 9
終止進程,殺死進程,該信號的響應方式不允許改變
(11)#define SIGUSR1 10
終止進程,用戶定義信號1
(12)#define SIGSEGV 11
建立CORE文件,段非法錯誤
(13)#define SIGUSR2 12
終止進程,用戶定義信號2
(14)#define SIGPIPE 13
終止進程、向一個沒有讀進程的管道寫數據,讀端關閉的描述符,寫端寫入時產生,該信號會終止程序
(15)#define SIGALRM 14
終止進程,計時器到時
(16) #define SIGTERM 15
終止進程,軟件終止信號,系統kill命令默認發送的信號
(17)#define SIGSTKFLT 16
(18)#define SIGCHLD 17
忽略信號,當子進程停止或退出時會默認給父進程發送該信號
(19)#define SIGCONT 18
忽略信號,繼續執行一個停止的進程
(20)#define SIGSTOP 19
停止進程 非終端來的停止信號
(21)#define SIGTSTP 20
停止進程,終端來的停止信號 Ctrl+Z
(22)#define SIGTTIN 21
停止進程,后臺進程讀終端
(23)#define SIGTTOU 22
停止進程,后臺進程寫終端
(24)#define SIGURG 23
忽略信號,I/O緊急信號
5.信號的實現
收到信號的實體是一個進程,信號的實現在進程的PCB中記錄,在PCB中有一個長整型變量signa:long a;
,它有32個位,一開始它的值都為0,表示沒有收到信號,假如現在通過kill(pid,sig)
發送了一個信號,然后通過pid找到對應的PCB中的a,如果通過信號代號把a的1偏移對應的代號個位置,就代表當前進程收到了對應的代號的信號,接下來要處理這個信號,處理完這個信號的時候在把a恢復成0就可以了。如果極短時間內連續發送多個代號相同的信號,其實只能響應一次,因為第一次發送該信號時就已經把a的1偏移了對應的代號個位置,后面再發送相同的信號時是沒有變化的,所以當a發生偏移還沒有恢復之前,連續發送相同的信號沒有意義。