首页 > 解决方案 > sigprocmask 后的信号传递

问题描述

我的印象是,使用sigprocmask()解除阻塞信号会导致待处理的阻塞信号被传递给处理。

sigprocmask()在用于解除阻塞信号的特定情况下,如果存在SIGUSR1已解除阻塞的挂起信号(例如 ),是否会通过调用解除阻塞不同信号SIGUSR1的调用将信号传递给进程,sigprocmask()同时保持SIGUSR1解除阻塞?

标签: signalssigprocmask

解决方案


要彻底理解它,我们需要了解信号是如何在 linux 中生成和传递的。

当内核收到任何信号请求时,它会为进程设置信号挂起标志,前提是信号没有被阻塞。现在,在返回用户模式之前,内核检查是否存在用于进程的非阻塞挂起信号。如果是,那么内核更愿意在返回用户模式之前传递该信号。现在来回答你的问题:

如果有一个挂起的信号(比如 SIGUSR1)已经被解除阻塞,

我假设信号(SIGUSR1)首先被阻塞,然后被解除阻塞。在这种情况下,当用户尝试解除对信号的阻塞时,将在用户进程以用户模式恢复之前传递信号。例如。如果sigprocmask()用于解除阻塞信号,则信号将在sigprocmask()返回之前传递。

信号 SIGUSR1 是否会通过调用 sigprocmask() 来传递给进程,从而在保持 SIGUSR1 畅通的同时解除对不同信号的阻塞?

如果多个挂起的信号被解除阻塞并准备好传递,那么内核会选择具有最低信号数的信号(当然,同步信号比异步信号具有更高的优先级)首先传递。


推荐阅读