Pesquisei muito mas não encontrei solução. Então pode ser uma pergunta boba.
O formato do waitpid é
pid_t waitpid (pid_t pid, int *status, int options)
O parâmetro pid especifica exatamente qual processo ou processos aguardar. Seus valores se dividem em quatro campos:
< -1
Wait for any child process whose process group ID is equal to the absolute value of this value.
-1
Wait for any child process. This is the same behavior as wait( ).
0
Wait for any child process that belongs to the same process group as the calling process.
> 0
Wait for any child process whose pid is exactly the value provided.
Agora, a questão é: e se pai e filho tiverem id de grupo diferente e o id de grupo do filho for 1. Como usar waitpid para esse filho específico? Como não podemos usar -1, ele dirá para esperar por qualquer criança.
Você só pode esperar pelas crianças do seu processo.
Se o filho alterar o ID do grupo de processos, o novo ID do grupo de processos poderá ser usado como um número negativo com
waitpid()
.BTW: a função
waitpid()
está obsoleta desde 1989. A função moderna é:waitid()
e suporta o que você gosta:Se você gosta de esperar por um grupo de processos, use:
Portanto, se você realmente tiver um processo no ID do grupo de processos 1, chame:
Mas como
init
já usa esse id de grupo de processos, você precisaria ser oinit
processo para poder ter filhos sob pgid 1.No entanto, isso não funcionará se você estiver em uma plataforma que não implementa
waitid()
como syscall, mas como uma emulação em cima dowaitpid()
.As vantagens
waitid()
são:permite especificar claramente o que esperar (por exemplo, P_PID P_PGID P_ALL)
retorna todos os 32 bits do
exit(2)
parâmetro no filho de volta ao processo pai.permite esperar com a flag:
WNOWAIT
que não colhe o filho e o guarda para depois na tabela de processos.BTW: O ponteiro siginfo_t
waitid()
é idêntico ao segundo parâmetro da função de manipulador de sinal paraSIGCHLD
.Você terá alguns problemas para entrar em uma situação em que o ID do grupo de processos de um processo filho seja
1
.Os grupos de processos são principalmente para shells que executam processos em primeiro e segundo plano (pipelines). Normalmente, quando um novo grupo de processos é iniciado, ele obtém o ID do grupo de processos do ID do processo do primeiro processo. Você não terá uma criança com PID 1, então também não terá uma criança com PGID 1.
A
setpgid()
chamada permite mover o processo de um grupo de processos para outro, mas eles ainda precisam fazer parte da mesma sessão (login), então você também não pode mover um processo para o PGID 1 dessa maneira.Se você tem um shell rodando como PID 1, então ele também pode ter PGID 1. Mas desde que o shell altere o PGID de seus filhos, eles terão um PGID diferente.