一、signal 函数
(1)原型:
typedef void (*sighandler_t)(int);
sighandler_t signal(int signum, sighandler_t handler);
(2)参数:
参数 1:捕捉指定的信号
参数 2:函数指针(因此需要写回调函数)
(3)回调函数:(作用:信号被捕捉后,要执行什么操作)
原型:void func(int num);
注意:只有当信号产生并捕捉后才调用
signal 函数虽然简单,但在 UNIX 不同版本中的行为可能不一样,所以,建议使用 sigaction 函数。
二、sigaction 函数
(1)函数原型:
int sigaction(int signum, const struct sigaction *act,struct sigaction *oldact);
(2)参数:
参数 1:需要捕捉的信号
参数 2:怎么去捕捉(在结构体中作设置);
参数 3:上次捕捉的相关信息,一般传 NULL
参数 2 结构体详情如下:
struct sigaction //函数调用时候传入地址
{
void (*sa_handler)(int); // 跟 signal 函数指针用法相同
sigset_t sa_mask; // 在信号处理过程中(从捕捉到回调函数执行完毕)临时屏蔽的信号集,在信号处理结束后,屏蔽信号继续执行,如果没有特别需求,先定义,再进行清空操作。
int sa_flags; // 固定写 0 这样可以与第一个参数(函数指针)相配套
};
(3)捕捉的一般流程:
struct sigaction act; // 设置参数 2 :结构体
act. sa_flags =0;
act. sa_handler = func; // 设置回调函数指针
sigemptyset(&act. sa_mask); // 置空临时屏蔽信号
// sigaddset(&act.sa_mask, signum1); // 临时屏蔽 signum1, 不需要屏蔽的话忽略此句
sigaction(signum2, &act, NULL); // 捕捉 signum2