Você só pode esperar por 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:
waitid(idtype, id, infop, opts)
idtype_t idtype;
id_t id;
siginfo_t *infop; /* Must be != NULL */
int opts;
Se você gosta de esperar por um grupo de processos, use:
waitid(P_PGID, pgid, infop, opts);
Portanto, se você realmente tiver um processo no ID do grupo de processos 1, ligue:
waitid(P_PGID, 1, infop, opts);
Mas como init
já usa esse id do grupo de processos, você precisa ser o processo init
para poder ter filhos no pgid 1.
No entanto, isso não funcionará se você estiver em uma plataforma que não implementa waitid()
como um syscall, mas como uma emulação na parte superior do waitpid()
desatualizado.
As vantagens de waitid()
são:
-
permite especificar claramente o que esperar (por exemplo, P_PID P_PGID P_ALL)
-
retorna todos os 32 bits do parâmetro
exit(2)
no filho de volta ao processo pai. -
permite esperar com o sinalizador:
WNOWAIT
que não colhe o filho e o mantém para mais tarde na tabela de processos.
BTW: O ponteiro siginfo_t em waitid()
é idêntico ao segundo parâmetro da função de manipulador de sinal para SIGCHLD
.