一个过程如何才能知道它已经收到信号
如果我错了,请纠正我。 这是我对信号的理解:
据我所知,信号发生和信号传递是两回事。 为了生成一个信号,操作系统只需在过程的过程控制块(PCB)中维护的位阵列中设置一个位。 每个位对应一个特定的信号,当一个位被置位时,这意味着该位对应的信号处于挂起状态。
交付:在将控制转移回用户模式下的进程之前,内核始终检查此进程的未决信号。 此检查必须发生在内核空间,因为某些进程永远不能忽略某些信号 - 即SIGSTOP和SIGKILL。
那么这是否意味着信号只能在内核调度该过程(即分配CPU)时才能传递给进程? 当进程在CPU上实际执行时,进程是否可以获得信号? 如果是这样,它怎么可能,即过程如何才能知道一个信号正在等待它(因为它在用户模式下执行并且不能访问PCB)
假设有多处理器机器,所以存在真正的并行性,即多个进程正在同时执行。 进程P1在CPU1上执行,进程P2在CPU2上执行,现在进程P2(具有足够的权限)向进程P1发送信号。 此信号现在是传送到P1还是将在P1由于某种原因放弃CPU之后交付,并在稍后再由内核重新安排时间,然后将此信号传送到进程P1。
请不要说这个问题是依赖于实现的。 如果你发现正确的答案是实现定义的,那么我在Linux,FreeBSD或你所知道的任何* nix平台上寻找答案。
非常感谢您的帮助和耐心:)
问候
拉利
答案是依赖于实现:)。 在Mac OS X(和FreeBSD)上,信号是异步处理的 - 内核找到一个不阻塞信号的线程,并在该线程上设置异步系统陷阱标志。 内核下一次调度该线程时,它将处理陷阱(退出进程,忽略陷阱,或者根据需要调用用户空间中的信号处理程序),而不是在用户空间中安排通常的线程延续。
在Solaris上,实现有些类似,但它也提供基于硬件陷阱的同步信号 - 同步信号被传递到引发陷阱的线程,而异步信号以上述方式工作。
Linux做类似于Solaris的操作(我不确定该讨论的结论如何,但讨论很有用)。
Posix.4也定义了实时信号,但我没有与这些工作。
简短的回答是 - 是的,进程只在下一个预定的CPU时间片上获得信号的知识。
如何知道进程已收到信号 - 可能会调用sigprocmask(2)。
进程P1在CPU1上执行,进程P2在CPU2上执行,现在进程P2(具有足够的权限)向进程P1发送信号。 此信号现在是传送到P1还是将在P1由于某种原因放弃CPU之后交付,并在稍后再由内核重新安排时间,然后将此信号传送到进程P1。
据我所知,在最后一个linux内核中,当P2发出信号并立即传送信号时,P1的执行可能会暂停。 可能这只适用于实时信号
链接地址: http://www.djcxy.com/p/50017.html上一篇: How does a process come to know that it has received a signal