正如标题中的额外问题,进程组可以有后代吗?
答案1
您可以通过实验相当容易地找到答案。我在这里假设“双叉”你的意思是仅有的双叉。考虑以下程序:
#include <stdio.h>
#include <unistd.h>
int main(void)
{
printf("original pid/pgid: %d/%d\n", getpid(), getpgrp());
if (fork() != 0) { return 0; }
printf("after first fork pid/pgid: %d/%d\n", getpid(), getpgrp());
if (fork() != 0) { return 0; }
printf("after second fork pid/pgid: %d/%d\n", getpid(), getpgrp());
return 0;
}
程序打印进程ID和进程组ID,fork,子进程再次打印它,再次fork,然后子进程再次打印它。
程序的运行示例:
$ ./a.out
original pid/pgid: 7306/7306
after first fork pid/pgid: 7307/7306
after second fork pid/pgid: 7308/7306
正如您所看到的,进程组 ID 不会在各个分支之间发生变化。
答案2
谷歌上的快速双重检查显示了这一点man getpgrp
:
https://linux.die.net/man/2/getpgrp
通过 fork(2) 创建的子进程继承其父进程的进程组 ID。 PGID 在 execve(2) 中保留。
换句话说,每个子进程的进程组自动与其父进程相同。因此,默认情况下,孙子将共享相同的进程组。