当我双叉一个进程时,分离的进程仍在同一个进程组中吗?

当我双叉一个进程时,分离的进程仍在同一个进程组中吗?

正如标题中的额外问题,进程组可以有后代吗?

答案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) 中保留。

换句话说,每个子进程的进程组自动与其父进程相同。因此,默认情况下,孙子将共享相同的进程组。

相关内容