gha*_*der 20 unix linux signals
如果我错了,请纠正我.以下是我对信号的理解:
据我所知,信号生成和信号传递是两回事.为了产生信号,OS简单地在过程的过程控制块(PCB)中维持的位阵列中设置一位.每个位对应一个特定信号,当一个位置位时,表示该位对应的信号未决.
交付:在将控制权转移回用户模式的流程之前,内核始终会检查此流程的待处理信号.此检查必须在内核空间中进行,因为进程永远不会忽略某些信号 - 即SIGSTOP和SIGKILL.
那么这是否意味着只有在内核调度该进程(即分配CPU)时才能将信号传递给进程?当一个进程在CPU上实际执行时,它是否可以获得信号?如果是这样,那怎么可能,即该过程如何知道信号正在等待它(因为它在用户模式下执行而无法访问PCB)
假设有多处理器机器,因此存在真正的并行性,即多个进程同时执行.进程P1在cpu 1上执行,进程P2在cpu2上执行,现在进程P2(具有足够的权限)向进程P1发送信号.此信号是立即传送到P1还是在P1因某种原因放弃CPU之后传送,并在稍后由内核重新安排,然后将此信号传送到过程P1.
请不要说这个问题是依赖于实现的.如果您发现正确的答案是实现定义,那么我正在寻找Linux,FreeBSD或您知道的任何*nix平台的答案.
非常感谢您的帮助和耐心:)
问候
拉利
小智 12
答案是依赖于实现:).在Mac OS X(和FreeBSD)上,信号是异步处理的 - 内核找到一个没有阻塞信号的线程,并在该线程上设置Asynchronous System Trap标志.下次内核调度该线程时,它会处理陷阱(退出进程,忽略陷阱,或在用户空间中调用信号处理程序),而不是在用户空间中安排线程的常规延续.
在Solaris上,实现有点类似,尽管它还提供基于硬件陷阱的同步信号 - 同步信号被传递到引发陷阱的线程,而异步信号以上述方式工作.
Linux做了类似于 Solaris的事情(我不确定该引用中的结论是如何从讨论中得出的,但这是有用的讨论).
Posix.4还定义了实时信号,但我没有使用过它们.