NAME
sigaction, rt_sigaction - examine and change a signal action
SYNOPSIS
#include <signal.h>
int sigaction(int signum, const struct sigaction *act,
struct sigaction *oldact);
signum: 所要操作的信号
act: 对signum信号要注册的新的行为
oldact: signum信号旧的行为
struct sigaction结构体原型:
struct sigaction {
/*
响应函数 多信号共用,避免重入现象
sa_handler:指定信号捕捉后的处理函数名(即注册函数)。也可赋值为SIG_IGN表忽略 或 SIG_DFL表执行默认动作;
*/
void (*sa_handler)(int);
void (*sa_sigaction)(int, siginfo_t *, void *);//三参响应函数,sa_sigaction 同样可以多信号共用,siginfo_t 信号来源识别
/*
调用信号处理函数时,所要屏蔽的信号集合(信号屏蔽字)。
注意:仅在处理函数被调用期间屏蔽生效,是临时性设置
*/
sigset_t sa_mask; //需要阻塞的其他信号集合
/*
sa_flags:通常设置为0,表示用默认属性。
默认属性即为:sa_mask中将自己屏蔽,即该信号的注册函数执行期间,再次向进程发送该信号,
该信号不能递达,处于未决状态。
SA_NOCLDWAIT属性,阻止子进程变成僵尸状态,从而免去收僵尸的麻烦
SA_SIGINFO:当信号处理函数为3参的函数时要加上
多个参数之间用 | 实现共用
*/
int sa_flags; //特殊要求
/* 基本不被使用 */
void (*sa_restorer)(void);
};
sigaction()相对于signal()的优点:
signal()函数当多个信号共用一个信号处理函数的时候,可能会发生重入,导致段错误。sigaction()可以在响应一个信号的时候,将其他信号阻塞。
signal()函数不能指定接收信号来源, sigaction()用3参的形式可以区别信号的来源,从而决定操作哪边的信号;