gpt4 book ai didi

linux - 一个进程如何知道它已经收到一个信号

转载 作者:IT王子 更新时间:2023-10-29 00:18:35 24 4
gpt4 key购买 nike

如有错误请指正。这是我对信号的理解:

As far as i know, signal generation and signal delivery are 2 different things. In order to generate a signal, the OS simply sets a bit in a bitarray maintained in the Process Control Block(PCB) of the process. Each bit corresponds to a particular signal, and when a bit is set, it means the signal corresponding to the bit is pending.

Delivery: Before transferring control back to a process in user mode, the Kernel always checks the pending signals for this process. This check must happen in Kernel space because some signals can never be ignored by a process – namely SIGSTOP and SIGKILL.

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

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

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

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

问候

拉里

最佳答案

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

在 Solaris 上,实现有些相似,尽管它也提供基于硬件陷阱的同步信号 - 同步信号被传送到引发陷阱的线程,而异步信号以上述方式工作。

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

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

关于linux - 一个进程如何知道它已经收到一个信号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1860175/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com