在类Unix操作系统中,如果进程的pid和pgid相等,则该进程是进程组的领导者。
然而,如果进程领导者已经退出,而同一组中的其他进程仍在运行,那么谁将成为接替的领导进程呢?
然而,如果进程领导者已经退出,而同一组中的其他进程仍在运行,那么谁将成为接替的领导进程呢?
没有接替的领导者:一旦进程组的领导退出,该组就失去了领导。没有必要让进程组有一个领导,没有领导也完全可以,您仍然可以使用kill(2)
向组中每个元素发送信号。
当领导者退出时会发生什么取决于组中进程的状态以及该组是否被分类为孤儿进程组。
首先,让我们看看什么是孤儿进程组。
POSIX将孤儿进程组定义为其中每个进程的父进程要么是该组的成员,要么是另一个会话的一部分。
换句话说,只要组中至少有一个进程具有不同进程组但在相同会话中的父级,则进程组不是孤儿进程组。
这个定义可能一开始看起来有点奇怪,但这背后有一个原理,在稍后将会(希望)清晰明了。
那么为什么知道组是否是孤儿很重要呢?因为存在停止的进程。如果进程组是孤儿,并且该组中至少有一个进程已经停止(例如,它被SIGSTOP
或SIGTSTP
挂起),那么POSIX.1要求将发送SIGHUP
后跟SIGCONT
,以避免进程永远停止:考虑会话领导者和进程组领导者退出并且该组剩下一个停止的进程的情况。由于父级在另一个会话中,它没有权限发送SIGCONT
,因此该进程将永远不会再运行。
另一方面,如果父级在相同的会话但是在不同的组中,则有可能使用SIGCONT
向停止的进程发送信号,因此该组不被视为孤儿进程组,也无需强制唤醒停止的进程。