【问题标题】:does a blocked signal also a pending signal?阻塞信号也是待处理信号吗?
【发布时间】:2020-09-13 01:18:15
【问题描述】:

我们知道应用程序可以使用sigprocmask 函数显式阻塞和取消阻塞选定的信号,所以假设我们已经使用这个函数阻塞了SIGINT,因此内核设置阻塞向量中的相应位。如果我们运行程序,按Ctrl+C发送SIGINT,由于这个信号当前被阻塞,进程没有动作(进程不会被终止)。

我的问题是,即使这个信号被阻塞了,内核是否也会设置待处理向量中的相应位,以便当我们解除阻塞这个信号时,待处理中的SIGINT 将立即被进程接收?还是之前的SIGINT 不算数,必须触发新的SIGINT

【问题讨论】:

  • 是的,信号将被视为“待处理”,并在解除阻塞后立即发送。 (不是一个答案,因为我在平板电脑上,因此查找 POSIX 的相关位来支持这个断言将是太多的工作。)

标签: c signals


【解决方案1】:

我不确定行为会如何(或是否)因平台而异,或因库实现而异,但是:

https://man7.org/linux/man-pages/man7/signal.7.html

一个信号可能被阻塞,这意味着它不会被传递 直到它后来被解锁。在它产生的时间之间 当它被传递时,一个信号被称为待处理。

所以是的,为了回答您的问题,Ctl-C 将处于“待处理”状态,如果您取消阻止 SIGINT,则应该交付。

sigaction() 也值得考虑,它可以让您的进程完全忽略信号。

【讨论】:

  • 也许我正在考虑另一个功能,但不是 sigactionsignal 弃用了吗?
  • @DanielWalker:如果有什么signal 被弃用而有利于sigaction - 那是更新和更强大的界面。虽然 signal 实际上并没有被弃用,只是旧的,除非你需要处理一个古老的 pre-POSIX unix 系统,否则你不应该使用它。
  • 是的,也许我把那些倒过来了。
猜你喜欢
  • 2013-11-29
  • 1970-01-01
  • 2011-04-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多