头文件<signal.h>
头文件<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>