shell可以通过管道符将前一个进程的标准输出重定向到后一个进程的标准输入。用如下程序观察管道前后进程的父进程和进程组:
void func() {
printf("pid is %d\n", getpid());
printf("ppid is %d\n", getppid());
printf("group id is %d\n", getpgid(0));
}
编译得到可执行文件按照如下命令执行:
./a.out > tmp | ./a.out
终端显示标准输出:
pid is 17733
ppid is 32144
group id is 17732
tmp文件内容:
pid is 17732
ppid is 32144
group id is 17732
其中,32144是登录shell的进程号,可见,两个进程都是从登录shell中fork和exec出来的,第一个进程作为进程组的组长,这个很好理解,注意shell将第二个进程也放到第一个进程的进程组中