首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >一个进程如何知道它已经收到了一个信号

一个进程如何知道它已经收到了一个信号
EN

Stack Overflow用户
提问于 2009-12-07 22:05:18
回答 4查看 5.4K关注 0票数 21

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

据我所知,信号生成和信号传递是两码事。为了产生信号,OS简单地设置在进程的进程控制块(PCB)中维护的位数组中的位。每个比特对应于一个特定信号,当一个比特被设置时,它意味着与该比特对应的信号处于挂起状态。

传送:在将控制转移回用户模式下的进程之前,内核总是检查该进程的挂起信号。此检查必须在内核空间中进行,因为某些信号永远不能被进程忽略-即SIGSTOP和SIGKILL。

那么,这是否意味着只有在内核调度某个进程,即分配CPU时,才能将信号传递给该进程?当一个进程实际在CPU上执行时,它能得到一个信号吗?如果是这样的话,它是如何可能的,即进程如何知道信号对它来说是挂起的(因为它在用户模式下执行,并且不能访问PCB)

假设有多个处理器机器,因此存在真正的并行性,即多个进程同时执行。进程P1在CPU1上执行,进程P2在cpu2上执行,现在进程P2(具有足够的特权)向进程P1发送一个信号。这个信号是现在就传送给P1,还是在P1出于某种原因放弃CPU后再传送,并在稍后由内核重新调度,然后将这个信号传送给进程P1。

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

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

问候

拉利

EN

回答 4

Stack Overflow用户

发布于 2009-12-07 22:34:37

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

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

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

Posi.4也定义了实时信号,但我还没有用过这些。

票数 12
EN

Stack Overflow用户

发布于 2009-12-12 22:49:21

简短的答案是-是的,进程只在下一个调度的CPU时间片上获得信号的知识。

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

票数 4
EN

Stack Overflow用户

发布于 2009-12-15 17:04:54

进程P1在CPU1上执行,进程P2在cpu2上执行,现在进程P2(具有足够的权限)向进程P1发送一个信号。这个信号是现在就传送给P1,还是在P1出于某种原因放弃CPU后再传送,并在稍后由内核重新调度,然后将这个信号传送给进程P1。

据我所知,在上一个linux内核中,当P2发出信号时,P1的执行可能会暂停,并且信号会立即发送。只有对于实时信号才是这样的

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1860175

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档