Unix系统提供了两种方法来改变信号处置:signal和sigaction。这篇描述的是signal系统调用,是设置信号处理的原始API,所提供的接口比sigaction简单。另一方面,sigaction提供了signal所不具备的功能。进一步而言,signal的行为在不同UNIX实现间存在差异,这也意味着对可移植性有所追求的程序绝不能使用此调用来建立信号处理器函数。故此,sigaction是建立信号处理器的首选API。
#include <signal.h>
void (*signal(int sig, void (*handler)(int))) (int);
这里要对signal的原型做一些解释。第一个参数sig,标识希望修改处置的信号编号,第二个参数handler,则标识信号抵达时所调用函数的地址。该函数无返回值,并接收一个整型参数。因此,信号处理器一般具有一下形式:
void handler(int sig) {
/* Code for the handler */
}
signal返回值是之前的信号处置。像handler参数一样,这是一枚指针,所指向的是带有一个整型参数且无返回值的函数。换言之,编写如下代码,可以暂时为信号建立一个处理器函数,然后再将信号处置重置为其本来面目:
void (*oldHandler) (int);
oldHandler = signal(SIGINT, newHandler); if(oldHandler == SIG_ERR)
errExit("signal"); /* Do something else here. During this time, if SIGINT
is delivered, newHandler will be used to handle the signal. */ if(signal(SIGINT, oldHandler) == SIG_ERR)
errExit("signal");
使用signal,将无法在不改变信号处置的同时,还能获取到当前的信号处置。要想做到这一点,必须使用sigaction。