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