我正在阅读 The Design Of UNIX OS 并有一个疑问。
可以在 signal() 调用中指定信号处理函数。当进程收到该特定信号时,处理程序应该执行。如果进程接收到信号,则会运行一种称为 psig 的算法来处理信号。
如果指定了用户定义的处理程序,psig 算法会修改用户级上下文(即,将一个帧推送到堆栈顶部,堆栈指针指向堆栈顶部)。该帧指示处理函数的执行。
如果上述情况成立,则信号处理函数应始终在 signal() 调用返回后执行(因为内核将首先看到堆栈顶部的堆栈帧)。然而,事实并非如此,因为我可以在代码的早期(假设在 main() 中)为特定信号指定信号处理程序,并在代码的稍后时间点发送信号。信号处理函数仅在发送信号时执行(例如通过kill()调用),而不是在signal()调用之后立即执行。
有人可以澄清一下吗?
答案1
我认为“UNIX 操作系统的设计”实际上是指 Maurice J. Bach 的“UNIX 操作系统的设计”。
我对您遇到的情况的最佳猜测是第 7.2.1 节,跨越 203 页到 204 页。他以两段描述如何设置一个信号处理程序,然后第三个开始描述内核在收到程序要求它捕获的信号时会做什么。
一个段落接着另一个段落这一事实并不能告诉您其中描述的事情在时间上紧接着发生。一本书的散文不是计算机算法。巴赫只是描述了两个独立的事情,没有明确告诉你中间可能发生其他事情。
所以答案是否定的,调用完成psig()
后不会立即运行signal(2)
。巴赫没说是这样。你只是假设了。