signal - 注册信号处理函数
Unix系统提供了signal和sigaction两种改变信号处理函数的方法。signal是设置信号处理函数的原始API, 比sigaction简单且功能少。
signal()无法在不改变信号处理函数的同时,还能获得当前的信号处理函数,但sigaction()可以
signal在UNIX实现间存在差异,对可移植性有要求的程序不能使用此调用来建立信号处理函数,sigaction是建立信号处理器的首选API
#include <signal.h>
void (*signal(int sig, void(*handler)(int)))(int);
参数:
- sig标识希望修改处理函数的信号编号,如
SIGINT,SIGTERM - handler标识信号抵达时所调用函数的地址。
返回值:
- 调用成功,返回之前的sig信号的处理函数
- 调用失败,返回
SIG_ERR
信号处理函数的形式一般为:
void handler(int sig) {
// Code for handler
}
当指定handler参数时,可以使用SIG_DFL和SIG_IGN来代替函数地址:
SIG_DFL:将信号的处理函数重置为默认值SIG_IGN: 忽略该信号。内核会将信号丢弃,进程甚至不知道产生过该信号
typedef void (*sighandler_t)(int);
// register new handler and remember old handler
sighandler_t old_handler = signal(SIGINT, new_handler);
if (old_handler == SIG_ERR) {
// Error and exit
}
// do something
// restore old handler
if (signal(SIGINT, old_handler) == SIG_ERR) {
// Error and exit
}

浙公网安备 33010602011771号