标签列表子进程在进行fork系统调用后,为什么不会继承父进程的未决信号?processsignalsarchitecturefork4有人能告诉我为什么待处理的信号不会被子进程继承吗?另一方面,子进程会从父进程继承信号处理程序和信号屏蔽字,这是为什么呢?如果能提供一个例子,我会更好地理解这个概念。
- user103691个回答3请问有人能告诉我为什么挂起的信号不会被子进程继承吗?
信号分为两种类型:同步和异步。同步信号是内核响应进程操作引起的,例如常见的SIGSEGV。异步信号通常来自其他进程,并且在某个任意时间点到达。"挂起"信号可能是尚未传递的信号,或者是接收进程暂时阻止的信号。考虑一些挂起的情况以及为什么子进程继承它们是不合适的。
同步、未传递的信号:让我们以一个SIGSEGV的例子来说明,该信号因父进程发生访问冲突而挂起——我相信这实际上并不会发生,或者不足以从用户空间的角度来考虑它是"挂起"的,但出于论证的目的——那么犯了错误的是父进程,而不是子进程。如果子进程随后执行类似的操作(很可能会这样做),它将获得自己的信号。如果碰巧没有收到,则不应该接收父进程挂起的信号。
在“异步、未传递”情况下,如果信号在派生期间处于等待状态,然后传递给父进程,那么这实际上是没有意义的,因为该信号是“异步”的 -- 它不能打算在特定点中断进程,就像电话一样;来电者并不打算在你仍坐在椅子上时找到你,因为来电者无法知道这一点。来电的目的只是与你沟通某些事情。此外,信号是发送给特定进程的,并且子进程是具有自己 PID 的单独进程。如果我向进程 1001 发送一个信号,我不希望它也发送到进程 1002。
在“阻塞(同步或异步)”情况下,进程有意地将信号保留未决状态,因此它在派生之前有机会解除阻塞(但没有)。由于已知这种信号不会被子进程继承,所以这种情况是“设计上的”。例如,服务器接收到一个信号,并出于任何原因决定在回答传入请求时暂时阻塞它 -- 我认为可以使用 pselect() 实现这一点 -- 然后它派生一个子进程来处理该请求。然后再处理挂起的信号。
另一方面,子进程从父进程继承了信号处理程序和信号屏蔽字,这样做的原因是什么呢?
这似乎是fork概念的重要组成部分:子进程是父进程的副本。信号处理程序只是具有特殊目的的常规函数。同样,由于这一点是已知的,可以通过设计来利用它,或者相反地进行补偿。如果您不再想使用处理程序,很容易将其移除。
- goldilocks回答链接相关问题19 fork()和信号如何传递给进程14 为什么我的子进程的PGID不是父进程的PID?81 为什么当SIGINT发送给父进程时,它不会传递给子进程?6 由于信号,子进程异常退出时,bash不会退出。7 关于“fork”,子进程和“子shell”4 为什么fork有时返回父进程,有时返回子进程?7 杀死父进程不会杀死子进程。© 2023 根据CC BY-SA 4.0 许可证授权京ICP备19056307号-1