signal - 注册信号处理函数

发布时间 2023-11-19 19:37:52作者: SchemaL

Unix系统提供了signalsigaction两种改变信号处理函数的方法。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_DFLSIG_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
}