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