sigprocmask 后的信号传递

Delivery of Signal after sigprocmask

我的印象是使用 sigprocmask() 解锁信号会导致待处理的阻塞信号被传送到进程。

在使用sigprocmask()解锁信号的特定情况下,如果有一个挂起的信号(比如SIGUSR1)已经解锁,那么信号SIGUSR1会被传送吗通过调用 sigprocmask() 来解除对不同信号的阻塞,同时保持 SIGUSR1 畅通?

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

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

if there is a pending signal (say SIGUSR1) that is already unblocked,

我假设 signal(SIGUSR1) 首先被阻塞,然后被解除阻塞。在这种情况下,当用户尝试解除阻塞信号时,信号将在用户进程在用户模式下恢复之前被传送。对于前。如果 sigprocmask() 用于解锁信号,那么信号甚至会在 sigprocmask() returns.

之前传送

will the signal SIGUSR1 be delivered to the process with a call to sigprocmask() that unblocks a different signal while keeping SIGUSR1 unblocked?

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