Linux中信号相关的一个结构体struct sigaction主要在sigaction信号安装和sigqueue信号发送时会用到
该结构位于/usr/include/bits/sigaction.h
在里面可以找到该结构的描述
struct sigaction {
/* 联合数据结构中的两个元素_sa_handler和_sa_sigaction指定信号关联函数,即用户指定的
信号处理函数。除了可以是用户自定义的处理函数外,还可以为SIG_DEL(采用缺省的处理方式),
也可以为SIG_IGN(忽略信号)*/
union {
/* 指定的处理函数只有一个参数,即信号值,所以信号不能传递除信号值之外的任何信息 */
__sighandler_t _sa_handler;
/* 指定的信号处理函数带有三个参数,是为实时信号而设的(当然同样支持非实时信号),它指定一个3参数信号处理函数。
第一个参数为信号值,第三个参数没有使用(posix没有规范使用该参数的标准),第二个参数是指向siginfo结构的指针,
结构中包含信号携带的数据值*/
void (*_sa_sigaction)(int, struct siginfo *, void *);
} _u;
/* 指定在信号处理程序执行过程中,哪些信号应当被阻塞。缺省情况下当前信号本身被阻塞,防止信号的嵌套发送,
除非指定SA_NODEFER或SA_NOMASK标志位。请注意sa_mask指定的信号阻塞的前提条件,是在由sigaction()安装信号的处理
函数执行过程中由sa_mask指定的信号才被阻塞*/
sigset_t sa_mask;
/* sa_flags中包含了许多标志位,包括刚刚提到的SA_DEFEER及SA_NOMASK标志位。另一个比较重要的标志时SIG_INFO,当
设定了该标志位时,表示信号附带的参数可以被传递到信号处理函数中,因此,应该为_sa_sigaction指定了信号处理函数,
如果不设置SA_SIGINFO,信号处理函数同样不能得到信号传递过来的数据,在信号处理函数中对这些信息的访问都将导致段错误
很多文献在阐述该标志位时都认为,如果设置了该标志位,就必须定义三参数信号处理函数。实际不是这样的,验证方法很简单:
自己实现一个单一参数信号处理函数,并在程序中设置该标志位,可以查看程序的运行结果。实际上,可以把该标志位看成信号
是否传递参数的开关,如果设置该位