一个过程如何知道它已收到信号

时间:2009-12-07 14:05:18

标签: linux unix signals

如果我错了,请纠正我。以下是我对信号的理解:

  

据我所知,信号生成   和信号传递有两种不同   的东西。为了产生信号,   OS只是在bitarray中设置了一点   在过程控制中维护   块(PCB)的过程。每一点   对应于特定信号,   当一个位置位时,它意味着   对应于该位的信号是   悬而未决。

     

交货:转让控制权之前   回到用户模式的进程,   内核始终检查挂起   这个过程的信号。这个检查   必须在内核空间中发生,因为   一些信号永远不会被a忽略   过程 - 即SIGSTOP和SIGKILL。

这是否意味着只有在内核调度该进程(即分配CPU)时才能将信号传递给进程?当一个进程在CPU上实际执行时,它是否可以获得信号?如果是这样,那怎么可能,即该过程如何知道信号正在等待它(因为它在用户模式下执行而无法访问PCB)

假设存在多处理器机器,因此存在真正的并行性,即多个进程同时执行。进程P1在cpu 1上执行,进程P2在cpu2上执行,现在进程P2(具有足够的权限)向进程P1发送信号。此信号是立即传送到P1还是在P1因某种原因放弃CPU之后传送,并在稍后由内核重新安排,然后将此信号传送到过程P1。

请不要说这个问题是依赖于实现的。如果您发现正确的答案是实现定义,那么我正在寻找Linux,FreeBSD或您所了解的任何* nix平台的答案。

非常感谢您的帮助和耐心:)

此致

拉​​利

4 个答案:

答案 0 :(得分:12)

答案是依赖于实现的:)。在Mac OS X(和FreeBSD)上,信号是异步处理的 - 内核找到一个没有阻塞信号的线程,并在该线程上设置Asynchronous System Trap标志。下次内核调度该线程时,它会处理陷阱(退出进程,忽略陷阱,或在用户空间中调用信号处理程序),而不是在用户空间中安排线程的常规延续。

在Solaris上,实现有点类似,虽然它还提供基于硬件陷阱的同步信号 - 同步信号被传递到引发陷阱的线程,而异步信号以上述方式工作。

Linux does something similar到Solaris(我不确定该引用的结论是如何从讨论中得出的,但讨论是有用的)。

Posix.4还定义了实时信号,但我没有使用过它们。

答案 1 :(得分:3)

简短的回答是 - 是的,进程仅在下一个计划的CPU时间片上获得信号的知识。

如何知道进程已收到信号 - 它可能会调用sigprocmask(2)。

答案 2 :(得分:0)

  

进程P1在cpu 1上执行,进程P2在cpu2上执行,现在进程P2(具有足够的权限)向进程P1发送信号。此信号是立即传送到P1还是在P1因某种原因放弃CPU之后传送,并在以后由内核重新安排,然后将此信号传送到过程P1。

据我所知,在最后一个linux内核上,当P2发出信号并且信号将立即传送时,P1的执行可能暂停。对于实时信号可能是真的

答案 3 :(得分:0)

如果我没记错的话,在8085指令的最后一个T状态期间检查中断到达位。因此必须有一种方法可以在信号到达时产生实际中断,或者在检查信号位之前必须有一个(常数?)代码片。

不幸的是,似乎回答一些内核行为相关问题的唯一方法是通过源代码,因为它们是如此依赖于实现"。对电脑进行编程实际上就是骚扰 - 这是一个什么样的职业选择!

尽量做到完美,希望这个网站有所帮助。