问题描述
我们知道应用程序可以使用sigprocmask
函数显式地阻塞和解除阻塞选定的信号,所以假设我们已经使用此函数来阻塞SIGINT
,因此内核将阻塞向量中的相应位设置为。如果我们运行该程序并按Ctrl + C发送SIGINT
,则由于此信号当前已被阻止,因此该进程没有任何动作(该进程不会终止)。
我的问题是,即使该信号被阻塞,内核也将在待处理向量中设置相应的位,以便当我们取消阻塞该信号时,待处理中的SIGINT
将被进程立即接收吗?或之前的SIGINT
不算在内,您必须触发一个新的SIGINT
?
解决方法
我不确定行为在平台之间或在库实现与实现之间如何(或是否)有所不同,但是:
https://man7.org/linux/man-pages/man7/signal.7.html
信号可能被阻止,这意味着它不会被传递 直到以后将其解除阻止。生成时间之间 并在传递信号时将其挂起。
是的,为了回答您的问题,Ctl-C将处于“待处理”状态,如果您取消阻止SIGINT,则应将其交付。
还值得考虑使用sigaction(),这将使您的过程完全忽略信号。