2

我正在阅读有关进程组的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。

非常感谢。

4

1 回答 1

1

看起来shell在启动您的命令时会为您提供一个新的pgid;而vim没有。

于 2013-10-05T14:03:23.137 回答