不vim'fork'一个shell来执行命令

时间:2013-10-05 13:54:42

标签: c linux shell vim fork

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

  

在大多数作业控制shell中,在 fork 之后调用此函数( setpgid ),以使子级设置自己的进程组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?

BTW, fork 总是自动设置子进程的进程组ID吗?我尝试在设置之前打印子进程的进程组ID,并打印父进程的进程ID。

非常感谢。

1 个答案:

答案 0 :(得分:1)

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