Não há conflito; um processo estará, por padrão, em um grupo de processos exclusivo, que é o grupo de processos de seu pai:
$ cat pg.c
#include <stdio.h>
#include <unistd.h>
int main(void)
{
fork();
printf("pid=%d pgid=%d\n", getpid(), getpgrp());
}
$ make pg
cc pg.c -o pg
$ ./pg
pid=12495 pgid=12495
pid=12496 pgid=12495
$
O fork
divide nosso processo em pai ( 12495
) e filho ( 12496
), e o filho pertence ao grupo de processos exclusivo do pai ( 12495
). bash
se afasta disso porque emite chamadas adicionais do sistema:
$ echo $$
12366
$
E depois, em outro terminal, corremos:
$ strace -f -o blah -p 12366
E depois de volta ao primeiro terminal:
$ ./pg
pid=12676 pgid=12676
pid=12677 pgid=12676
$
E então nós controlamos + c o strace
, e inspecionamos as chamadas do sistema:
$ egrep 'exec|pgid' blah
12366 setpgid(12676, 12676) = 0
12676 setpgid(12676, 12676 <unfinished ...>
12676 <... setpgid resumed> ) = 0
12676 execve("./pg", ["./pg"], [/* 23 vars */]) = 0
12676 write(1, "pid=12676 pgid=12676\n", 21 <unfinished ...>
12677 write(1, "pid=12677 pgid=12676\n", 21 <unfinished ...>
bash
usou a chamada setpgid
para definir o grupo de processos, colocando assim o nosso processo pg
no grupo de processos não relacionado ao do shell. ( setsid(2)
seria outra maneira de ajustar o grupo de processos, se você estiver procurando por chamadas do sistema.)