信号的捕获和处理
(1)What(什么是信号的捕获和处理)
信号捕获:
在程序中,信号的捕获可以看做是注册动作,提前告诉系统当遇到某个信号时做什么处理(换句话说,就是将信号和信号处理函数进行一一映射的过程)
信号处理:
本质就是一个调用处理函数来处理信号
(2)Why(为什么要进行信号的捕获和处理操作)
Linux中每个信号都有默认的处理动作,如果想要忽略或修改某个信号的默认动作,就需要在程序中捕获该信号,然后调用处理函数进行信号处理
(3)How(如何实现信号的捕获和处理)
signal函数:
用于注册一个信号处理函数,当指定的信号发生时,会调用相应的处理函数来执行特定的操作。
#include <signal.h>
signal(int signum, void(handfunc *)(int));
- 参数signum:信号编号
- 参数handfunc:信号处理函数
可以这样理解signal函数:它将信号和信号处理函数进行了映射,即就是说,当遇到signum信号时,会调用handfunc函数来处理该信号
sigaction函数
用于注册一个信号处理函数,当指定的信号发生时,会调用相应的处理函数来执行特定的操作。
#include <signal.h>
int sigaction(int signum,
const struct sigaction *act,
struct sigaction *oldact);
- 参数signum:信号编号
- 参数act:一个数据结构,里边包含信号处理函数
- 参数oldact:一个数据结构,保持之前signum信号的信号处理信息
sigaction 函数相对于 signal 函数提供了更精细的控制和更多的选项,使得对信号处理的配置更加灵活和强大
sigaction结构体
struct sigaction
{
void (*handfunc)(int signum);
void (*signaction)(int signum, siginfo_t *, void*);
sigset_t sa_mask;
int sa_flag;
}
- 参数sa_flag:为0时表示调用handfunc函数处理信号signum
- 参数sa_mask:处理函数所屏蔽的信号