在 Linux 编程接口中
要了解为什么孤立的进程组很重要,我们需要从 shell 作业控制的角度来看待事情。根据图 34-3 考虑以下场景:
在父进程退出之前,子进程已停止(可能是因为父进程向它发送了停止信号)。
当父进程退出时,shell 会从其作业列表中删除父进程组。孩子被init收养,成为终端的后台进程。包含子进程的进程组是孤立的。
此时,没有进程通过 wait() 监视停止子进程的状态。
由于 shell 没有创建子进程,因此它不知道子进程的存在,也不知道子进程与已故父进程属于同一进程组。此外,init 进程仅检查终止的子进程,然后收获生成的僵尸进程。因此,被停止的子进程可能会永远萎靡不振,因为没有其他进程知道向它发送 SIGCONT 信号以使其恢复执行。
即使孤立进程组中的已停止进程在不同的会话中有一个仍然存在的父进程,也不能保证该父进程能够向停止的子进程发送 SIGCONT。一个进程可以向同一会话中的任何其他进程发送 SIGCONT,但如果子进程在不同的会话中,则适用发送信号的正常规则(第 20.5 节),因此父进程可能无法向子进程发送信号如果子进程是已更改其凭据的特权进程。
为了防止出现上述情况,SUSv3 规定如果一个进程组成为孤立的并且有任何停止的成员, 那么该组的所有成员都会收到一个 SIGHUP 信号,以通知他们已经与会话断开连接,然后通过 SIGCONT 信号,以确保它们恢复执行。如果孤立的进程组没有任何停止的成员,则不会发送任何信号。
SIGHUP 的默认操作是终止。内核是否隐式地将 SIGHUP 发送到成为孤立并包含已停止进程的进程组意味着
组中的那些进程并且没有自己的 SIGHUP 处置将被终止?组中任何停止的进程是否会首先由 SIGCONT 恢复并由 SIGHUP 终止?
为了使组中的进程能够生存,它们需要有自己的 SIGHUP 处置还是忽略 SIGHUP?
谢谢。
请让我将 mosvy 的评论变成答案: