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
}
标签:old,函数,signal,handler,SIG,注册,信号处理
From: https://www.cnblogs.com/SchemaL/p/17842396.html