【发布时间】:2011-05-23 07:47:34
【问题描述】:
【问题讨论】:
-
This.
【问题讨论】:
TLPI
UNIX 系统提供两种方式 改变信号的配置:
signal()和sigaction()。这 sigaction() 系统调用是一个 替代信号()进行设置 信号的处置。虽然 sigaction() 稍微复杂一些 使用比信号(),作为回报 提供更大的灵活性。
sigaction 也比signal 更便携。此外,使用sigaction,您可以指定接收附加参数的信号处理程序(sa_sigaction 与 sa_handler)。
/* can be installed by signal / sigaction */
void(*) (int);
/* can be installed by sigaction only */
void(*) (int, siginfo_t *, void *);
【讨论】:
在我看来,区别(除了接口 :) 和可移植性)在于信号被捕获后的行为:
如果处置设置为函数,则首先处置被重置为 SIG_DFL,或者信号被阻塞(参见下面的可移植性),然后使用参数 signum 调用处理程序。如果调用处理程序导致信号被阻塞,则信号在从处理程序返回时被解除阻塞。
而且,我还想重复一下手册页所说的内容:
signal() 的行为因 Unix 版本而异,并且在历史上因 Linux 的不同版本而异。避免使用它:改用 sigaction(2)。
【讨论】: