我正在阅读有关流程组的 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。非常感谢。
答案 0 :(得分:1)
看起来shell在启动命令时会给你一个新的pgid;而vim没有。