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);
  • 返回旧的信号处理函数指针
posted @ 2025-08-11 15:45  最爱丁珰  阅读(4)  评论(0)    收藏  举报