Em geral, sim, o ID do grupo de processos é igual ao ID do processo que criou o grupo de processos - e esse processo criou o grupo de processos colocando-se no grupo.
Você pode encontrar essas informações na documentação da chamada do sistema setpgid
e de sua variante setpgrp
. Os detalhes variaram historicamente entre o BSD e o System V. Os casos de uso mais comuns são:
- Um processo se coloca em seu próprio grupo de processos e o novo PGID é igual ao PID. Isso pode ser feito com SysV
setpgrp()
ou comsetpgid(0, 0)
, em que0
pode ser substituído porgetpid()
explícito.
Note que enquanto o processo está se colocando no grupo, na prática, isso é feito frequentemente por um ativador (shell, ou monitor do daemon) antes de executar o programa , isto é é feito por código no iniciador entrefork
eexecve
no processo filho. -
Um processo se coloca em um grupo de processos existente na mesma sessão. Shells fazem isso para pipelines: para executar
foo | bar
em seu próprio grupo de processos, um shell normalmente faz algo assim:- Configurar um canal.
- Bifurque um processo. O filho se coloca em seu próprio grupo de processos G , fecha a extremidade de leitura do canal e move a extremidade de gravação para stdout, depois executa
foo
. - Bifurque um processo. O filho se coloca no grupo de processos existente G , fecha a extremidade de gravação do canal e move a extremidade vermelha para stdin, depois executa
bar
.
A chamada para
setpgid
pode ser executada no processo pai em vez de ou além do filho. Fazê-lo evita uma condição de corrida caso a inicialização do segundo filho ultrapasse o primeiro filho. -
Um shell com controle de job normalmente é executado em seu próprio grupo de processos. Mas antes de sair ou suspender, ele retorna ao seu grupo de processos original (ou seja, ele se coloca de volta no grupo de processos que o iniciou, supondo que esse grupo ainda exista).
A especificação POSIX para setpgid
descreve esses casos de uso. Além disso, explica que não há muito mais que seja garantido que funcione. Em particular, enquanto sistemas BSD antigos permitiam que um processo ingressasse em um grupo de processos em uma sessão diferente ou para criar um novo PGID, este não é o caso na maioria dos sistemas modernos (incluindo o moderno BSD).