8.5.5 编写信号处理程序
目录
P541
逐行解释 Signal 函数代码
这段代码是一个自定义的信号处理函数封装,使用了 sigaction 系统调用来设置信号处理程序。下面是逐行解释:
handler_t *Signal(int signum, handler_t *handler)
- 定义了一个名为
Signal的函数 - 参数:
signum是要设置的信号编号,handler是信号处理函数指针 - 返回类型:
handler_t *(指向旧信号处理函数的指针)
struct sigaction action, old_action;
- 声明两个
sigaction结构体变量:action:用于设置新的信号处理行为old_action:用于保存之前的信号处理行为
action.sa_handler = handler;
- 设置
action的信号处理函数为传入的handler
sigemptyset(&action.sa_mask);
- 使用
sigemptyset清空sa_mask信号集 - 这表示在处理当前信号时,不会阻塞任何其他信号(除了被处理的信号本身会被自动阻塞)
action.sa_flags = SA_RESTART;
- 设置
sa_flags标志为SA_RESTART - 这个标志表示如果信号中断了系统调用,系统调用应该自动重启而不是返回错误
if (sigaction(signum, &action, &old_action) < 0)
- 调用
sigaction系统调用:signum:要设置的信号编号&action:新的信号处理行为&old_action:保存旧的信号处理行为
- 检查返回值是否小于0(表示出错)
unix_error("Signal error");
- 如果
sigaction调用失败,调用unix_error函数报告错误
return (old_action.sa_handler);
- 返回旧的信号处理函数指针

浙公网安备 33010602011771号