不要vim“fork”一个shell来执行命令

我正在阅读有关进程组的APUE 。 这本书说,

在大多数作业控制shell中,在fork之后调用此函数( setpgid )以使subprocess设置自己的进程组ID。 其中一个要求是多余的,但是通过这两个过程,我们保证在任何一个过程假定发生这种情况之前,把这个孩子放到它自己的过程组中。

我写了下面这段代码来validation我的理解。 error handling被省略。

#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 fork一个shell来执行命令? 如果是这样,有什么区别或换句话说,为什么进程组ID不像第一个输出那样等于进程ID?

顺便说一下, fork是否总是自动设置subprocess的进程组ID? 我试图在设置它之前打印一个subprocess的进程组ID,并打印了父进程的进程ID。

非常感谢。

看起来,shell启动你的命令时会给你一个新的pgid; 而vim不。