阻塞的信号还会发出未决的信号吗?

问题描述

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

我的问题是,即使该信号被阻塞,内核也将在待处理向量中设置相应的位,以便当我们取消阻塞该信号时,待处理中的SIGINT将被进程立即接收吗?或之前的SIGINT不算在内,您必须触发一个新的SIGINT

解决方法

我不确定行为在平台之间或在库实现与实现之间如何(或是否)有所不同,但是:

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

信号可能被阻止,这意味着它不会被传递 直到以后将其解除阻止。生成时间之间 并在传递信号时将其挂起。

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

还值得考虑使用sigaction(),这将使您的过程完全忽略信号。