我的问题是关于信号并在操作系统内核中处理它们。
我知道每个进程都有自己的signal_handler()
表:一个 31 位的信号数组(pending_signals
),当信号到达时,do_signal() 被调用,它调用相关的signal_handler()
例程,该例程在用户模式下运行,而不是在内核模式(为什么会这样?)。
让我们假设进程得到了一些信号,即他的信号数组中的某个位是打开的,谁正在将它写入这个数组(我猜是调用信号的进程——我们当前在它的上下文中的进程),因此,流程如下:
A
调用信号并将其写入B
's 的信号数组(在返回用户模式之前?)然后在相同的上下文中(不切换到 B)B
调用 's 的这个信号的特定信号处理程序(我们什么时候切换到用户模式? ) 然后我们返回A
并检查它是否需要重新安排并继续......
第二件事是当信号是时发生了什么SIG_CHILD
,我想它应该发生在do_exit()
子进程调用的某个地方。
最后一件事是如何waitpid(pid_t num)
工作?
父亲如何无视SIG_CHILD
其他儿子的所有信号,只关心特定的儿子?
如果有很好的来源可以阅读以下内容,那就太好了(没有找到)。
在阅读您的问题时。我想你说的信号句柄
B
是在A
. 这听起来不正确。这将导致安全漏洞。信号处理程序总是在拥有进程的上下文中调用。然后,这将回答您关于
SIG_CHILD
.您还问为什么在用户空间中运行信号句柄。这是因为我们不想让进程将代码注入内核。如果他们这样做了,他们将成为系统的上帝。
信号处理程序在什么进程中运行?
如果一个进程调用 exec,并且加载的代码包含一个 signal_handler,并且如果这个信号处理程序运行,那么(就像所有其他加载的代码一样)它在这个进程中运行。您不会意外地从一个进程中找到在另一个进程中运行的代码。