【问题标题】:So what's the difference between sigaction() and signal()? [duplicate]那么 sigaction() 和 signal() 有什么区别呢? [复制]
【发布时间】:2011-05-23 07:47:34
【问题描述】:

可能重复:
What is the difference between sigaction and signal?

在我看来,它们都可以用来注册特定信号的回调。

你如何选择使用哪一个?

【问题讨论】:

标签: c signals


【解决方案1】:

TLPI

UNIX 系统提供两种方式 改变信号的配置: signal()sigaction()。这 sigaction() 系统调用是一个 替代信号()进行设置 信号的处置。虽然 sigaction() 稍微复杂一些 使用比信号(),作为回报 提供更大的灵活性。

sigaction 也比signal 更便携。此外,使用sigaction,您可以指定接收附加参数的信号处理程序(sa_sigactionsa_handler)。

/* can be installed by signal / sigaction */
void(*) (int);

/* can be installed by sigaction only */
void(*) (int, siginfo_t *, void *);

【讨论】:

    【解决方案2】:

    在我看来,区别(除了接口 :) 和可移植性)在于信号被捕获后的行为:

    如果处置设置为函数,则首先处置被重置为 SIG_DFL,或者信号被阻塞(参见下面的可移植性),然后使用参数 signum 调用处理程序。如果调用处理程序导致信号被阻塞,则信号在从处理程序返回时被解除阻塞。

    而且,我还想重复一下手册页所说的内容:

    signal() 的行为因 Unix 版本而异,并且在历史上因 Linux 的不同版本而异。避免使用它:改用 sigaction(2)。

    【讨论】:

      猜你喜欢
      • 2021-02-11
      • 2015-11-23
      • 2013-02-13
      • 2011-04-26
      • 2016-09-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多