我正在阅读有关进程组的APUE 。书上说,
在大多数作业控制 shell 中,此函数 ( setpgid ) 在fork之后调用以让子进程设置自己的进程组 ID。其中一个调用是多余的,但是通过同时执行这两个调用,我们可以保证在任一进程假定这已经发生之前,将子进程放入其自己的进程组中。
为了验证我的理解,我编写了以下代码。省略了错误处理。
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
printf("process ID: %d\n", getpid());
printf("process group ID: %d\n", getpgrp());
exit(0);
}
输出(直接在shell中运行):
进程 ID:4388
进程组 ID:4388
输出(在 vim 内运行):
process ID: 4401
process group ID: 4400 // pid of vim (through ps)
为什么结果不同?vim 不会派生一个 shell 来执行命令吗?如果是,有什么区别,或者换句话说,为什么进程组 ID 不等于进程 ID,就像第一个输出一样?
顺便说一句,fork是否总是自动设置子进程的进程组 ID?我尝试在设置子进程之前打印它的进程组 ID,它打印了父进程的进程 ID。
非常感谢。