信號是操做系統控制程序的方式,舉個栗子,操做系統在看到用戶輸入了Ctrl+C時,就會向程序發送中斷信號。 信號映射表git
信號 | 處理函數 |
---|---|
SIGURG | 不作事情 |
SIGINT | 調用exit() |
有時候你但願別人打斷你的程序時運行本身的代碼。假設進程打開了一些文件或網絡鏈接,你但願在退出以前把它們關閉,而且作一些清理工做。在這裏引入sigaction
結構。 sigaction是一個函數包裝器 sigaction是一個結構體,它有一個函數指針,siagction告訴操做系統進程收到某個信號時該調用哪一個函數。github
struct sigaction action; action.sa_handler = handler; sigemptyset(&action.sa_mask); action.sa_flag = 0;
sigemptyset用於設置信號,在信號被使用前必須調用sigemptyset
或sigfillset
,sigemptyset
在man中的函數原型和解釋是:網絡
int sigemptyset(sigset_t *set);
The sigemptyset() function initializes a signal set to be empty.函數
將信號初始化設置爲空。 處理器必須接收信號參數 信號是一個整型值,若是你建立了一個自定義處理函數,就須要接收一個整型參數:操作系統
void diediedie(int sig) { puts("Goodbye cruel world...\n"); exit(1); }
建立sigaction之後,須要用sigaction()函數註冊,使操做系統知道它的存在。指針
int sigaction(int sig, const struct sigaction *restrict act, struct sigaction *restrict oact);
sigaction()函數接收3個參數,信號,動做,舊動做(能夠傳NULL)。rest
int catch_signal(int sig, void (*handler)(int)) { struct sigaction action; action.sa_handler = handler; sigemptyset(&action.sa_mask); action.sa_flags = 0; return sigaction(sig, &action, NULL); }
這樣只要把信號和處理器傳給catch_signal()
函數,就能夠設置信號處理器了。code
運行程序後,可使用Ctrl+C發送一箇中斷信號,若是想發送其餘信號,能夠用在終端下用kill命令,格式爲kill -信號 進程號 kill -INT 1739
的效果和Ctrl+C同樣,都是發送中斷信號。進程
在進程內可使用raise()
函數向本身發送信號。 一般會在自定義的信號處理器中使用raise()
,這樣程序就能在接收到低級別的信號時引起更高級別的信號,這叫作信號升級。get