頭文件<signal.h>為處理各種各樣的信號聲明了一個類型和兩個函數,並且定義了幾個宏。
1、類型:sig_atomic_t
sig_atomic_t是 int 類型,在信號處理程序中作為變量使用。它是一個對象的整數類型,該對象可以作為一個原子實體訪問,即使存在異步信號時,該對象可以作為一個原子實體訪問。
2、宏:
SIG_DFL 默認的信號處理。
SIG_ERR 表示一個信號錯誤。
SIG_IGN 表示忽略信號。
有效的信號包括:
SIGABRT 異常終止,如調用abort()。
SIGFPE 算術運算出錯,如除數為0或溢出。
SIGILL 非法函數映象,如非法指令。
SIGINT 交互式信號,如中斷。
SIGSEGV 非法訪問存儲器,如訪問不存在的內存單元。
SIGTERM 發送給本程序的終止請求信號。
3、函數:
3.1函數signal
void (*signal(int sig,void (*handle)(int)))(int);
說明:signal()用於確定以后當信號sig出現時的處理方法。
參數:如果handler的值是SIG_DFL,那么就采用實現定義的缺省行為;如果handler的值是SIG_IGN,那么就忽略該信號;否則,調用handler所指向的函數(參數為信號類型)。
返回值:signal()返回信號sig原來的handler;如果出錯,則返回SIG_ERR。
當隨后出現信號sig時,就中斷正在執行的操作,轉而執行信號處理函數(*handler)(sig)。如果從信號處理程序中返回,則從中斷的位置繼續執行。
3.2函數raise
int raise(int sig);
說明:函數raise把信號sig發送給正在執行的程序。
返回值:執行成功返回0,不成功返回非0。
例:
#include <assert.h>
#include <signal.h>
#include <stdio.h>
#include <stdlib.h>
static int sigs[]={SIGABRT,SIGFPE,SIGILL,SIGINT,SIGSEGV,SIGTERM};
static void (*rets[])(int)={SIG_DFL,SIG_ERR,SIG_IGN};
static sig_atomic_t atomic;
static void field_fpe(int sig)
{
assert(sig==SIGFPE);
puts("success testing <signal.h>");
exit(EXIT_SUCCESS);
}
int main()
{
printf("sizeof (sig_atomic_t) = %u\n",sizeof(sig_atomic_t));
assert(signal(SIGFPE,&field_fpe)==SIG_DFL); //signal設置SIGFPE信號發生后的處理函數並返回信號處理程序之前的值
assert(signal(SIGFPE,&field_fpe)==&field_fpe); //判斷信號處理函數是否設置成功
raise(SIGFPE); //發送SIGFPE信號
puts("fail testing <signal.h>");
return (EXIT_FAILURE);
}
執行結果:
sizeof (sig_atomic_t) = 4
success testing <signal.h>
