信号集合(sigset_t)
关于这个数据结构的字义,我在 glibc 的源码中找到了如下的定义:
1  | typedef __sigset_t sigset_t;  | 
虽然因为多平台的原因还有其他的定义方式,但这些定义已经足够我们对这个结构有一个感
性的认识了。也可以猜测 Linux 平台下的信号种类不太可能超过 64 个。
信号集合有一组相关的函数如下:
1  | 
  | 
struct sigaction结构体
从man sigaction找到如下定义:
1  | struct sigaction {  | 
其中sa_handler和sa_sigaction只有一个有效,这取决于sa_flags中是否设置了SA_SIGINFO,如果没有设置则使用sa_handler,否则使用sa_sigaction。实际上,我
在 glibc 的源码中看到这两个变量是定义在一个 union 里的,所以对两个都进行设置的话
应该是不行的(并没有测试过)。我找到的源码如下,你可以尝试自己解读:
1  | struct sigaction  | 
注意sa_handler和sa_sigaction的函数签名是不一样的,对应了旧的和新的两种信号处
理机制。sa_sigaction的第二个参数可以携带一些信息,它的定义大概是(man sigaction):
1  | struct siginfo_t {  | 
虽然手册里给出的成员是这么多,但是我尝试的过程中发现编译器报错说某些不存在,我也
不清楚是怎么回事。
sa_sigaction的第三个参数是一个指向ucontext_t的指针,被转换为了void*,一般
这个参数并不使用(手册里说的。。。),关于这个参数更详细的解释可以使用命令man 3
getcontext查看。
sigaction函数
1  | 
  | 
如果第二个参数act不为NULL,signum的处理方式就被设置为act所指定的,如果第三个
参数oldact不为NULL,旧的处理方式就被保存在其中。下面是一个例子,演示基本用法:
1  | 
  | 
在我电脑上的执行结果为:
1  | $ clang sigaction.c  |