引言
在 Linux 系统编程中,信号处理是一个非常重要的主题。信号是进程间通信的一种基本方式,用于通知进程发生了某种事件。传统的 signal() 函数虽然简单易用,但在功能性和可移植性方面存在诸多限制。而 sigaction() 函数提供了更强大、更灵活的信号处理机制,是现代 Linux 程序设计中处理信号的首选方式。
sigaction 函数概述
sigaction() 函数允许我们检查或指定与特定信号相关联的处理动作,其函数原型如下:
#include <signal.h>
int sigaction(int signum, const struct sigaction *act, struct sigaction *oldact);
参数说明:
signum:要操作的信号编号(如 SIGINT、SIGTERM 等)act:指向新的信号处理动作的指针oldact:用于保存之前的信号处理动作(可为 NULL)
返回值:
- 成功时返回 0,失败时返回 -1 并设置 errno
struct sigaction 结构体
sigaction 结构体定义了信号处理的各种属性:
struct sigaction {
void (*sa_handler)(int); // 信号处理函数
void (*sa_sigaction)(int, siginfo_t *, void *); // 带有额外信息的处理函数
sigset_t sa_mask; // 阻塞信号集
int sa_flags; // 标志位
void (*sa_restorer)(void); // 已废弃
};
关键成员解析
- sa_handler:传统的信号处理函数指针,与
signal()函数使用的处理函数类型相同。 - sa_sigaction:更高级的信号处理函数指针,可以接收额外的信号信息。当
sa_flags包含 SA_SIGINFO 标志时使用此处理函数。 - sa_mask:在执行信号处理函数期间,需要阻塞的信号集。这可以防止信号处理函数被其他信号中断。


