信号集合(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 |