我的印象是,使用sigprocmask()
解除阻塞信号会导致待处理的阻塞信号被传递给处理。
sigprocmask()
在用于解除阻塞信号的特定情况下,如果存在SIGUSR1
已解除阻塞的挂起信号(例如 ),是否会通过调用解除阻塞不同信号SIGUSR1
的调用将信号传递给进程,sigprocmask()
同时保持SIGUSR1
解除阻塞?
我的印象是,使用sigprocmask()
解除阻塞信号会导致待处理的阻塞信号被传递给处理。
sigprocmask()
在用于解除阻塞信号的特定情况下,如果存在SIGUSR1
已解除阻塞的挂起信号(例如 ),是否会通过调用解除阻塞不同信号SIGUSR1
的调用将信号传递给进程,sigprocmask()
同时保持SIGUSR1
解除阻塞?
要彻底理解它,我们需要了解信号是如何在 linux 中生成和传递的。
当内核收到任何信号请求时,它会为进程设置信号挂起标志,前提是信号没有被阻塞。现在,在返回用户模式之前,内核检查是否存在用于进程的非阻塞挂起信号。如果是,那么内核更愿意在返回用户模式之前传递该信号。现在来回答你的问题:
如果有一个挂起的信号(比如 SIGUSR1)已经被解除阻塞,
我假设信号(SIGUSR1)首先被阻塞,然后被解除阻塞。在这种情况下,当用户尝试解除对信号的阻塞时,将在用户进程以用户模式恢复之前传递信号。例如。如果sigprocmask()
用于解除阻塞信号,则信号将在sigprocmask()
返回之前传递。
信号 SIGUSR1 是否会通过调用 sigprocmask() 来传递给进程,从而在保持 SIGUSR1 畅通的同时解除对不同信号的阻塞?
如果多个挂起的信号被解除阻塞并准备好传递,那么内核会选择具有最低信号数的信号(当然,同步信号比异步信号具有更高的优先级)首先传递。