当进程处于内核模式时,内核默认会阻止挂起信号吗?

当进程处于内核模式时,内核默认会阻止挂起信号吗?

计算机系统:程序员的视角 说:

8.5.1 信号术语

最多接收一次挂起信号。对于每个进程,内核在位pending向量中维护一组待处理信号,以及在位向量中维护一组阻塞信号blocked

8.5.3 接收信号

什么时候内核将进程 p 从内核模式切换到用户模式 (例如,从系统调用返回或完成上下文切换),它检查 p 的一组未阻塞的挂起信号(pending & ~blocked)。如果该集合为空(通常情况),则内核将控制传递给 p 的逻辑控制流中的下一条指令(I next)。然而,如果集合非空,那么内核在集合中选择一些信号 k(通常是最小的 k)并强制 p 接收信号 k。信号的接收会触发进程的某些操作。一旦流程完成操作,然后控制权传回到 p 的逻辑控制流中的下一条指令(I next)。

  1. 当进程处于内核模式时,内核默认会阻止挂起信号吗?

    blocked当进程处于内核模式时,内核是否会为待处理信号设置位向量中的位?

    在这种情况下,内核默认会阻止信号吗?与下面引用中的“隐式阻塞机制”的含义相同吗?

    8.5.4 阻塞和解除阻塞信号

    Linux 提供了隐式和显式的阻塞信号机制:

    隐式阻塞机制。默认情况下,内核会阻止处理程序当前正在处理的任何待处理信号类型。

  2. 在所选的挂起信号 k 完成处理后,是否会处理进程处于内核模式时挂起的剩余挂起信号? (引用说“一旦进程完成操作,控制权就会传回到 p 的逻辑控制流中的下一条指令(I next)。”)

谢谢。

答案1

不,内核不会修改阻塞向量。

仅当上下文从内核模式切换到该进程时,信号才会传递到该进程。请注意,当信号处理程序完成时,进程会调用sigreturn(2)将控制权返回给内核。

至于2,是和不是。是的,内核将在下次计划运行该进程时传递任何其他挂起信号。然而,对于大多数信号,相同类型的多个待处理信号,即SIGCHLD,将仅被传送一次。这就是上面描述的隐式阻塞。

某些信号可以中断正在运行的信号处理程序,即SIGSEGV在使用时SA_NODEFER(请参阅 参考资料sigaction(2))。

相关内容