头文件<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 ",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>

原文地址:https://www.cnblogs.com/Mr-Wenyan/p/7220755.html