A resposta de godlygeek é boa para entender como o sistema funciona, mas a pergunta subsequente que inevitavelmente se segue é:
Como determinar se um processo desapareceu?
A maneira correta de esperar em um processo em outro grupo de processos ou sessão é usar kill()
. Obviamente, essa é uma resposta não intuitiva. Você não pode usar a família de funções wait
porque o sinal SIGCHILD nunca será passado para o seu processo, nem você pode obter o código de status. O kill()
, no entanto, pode informar quando um processo específico desapareceu passando 0 para o sinal a ser enviado, que simplesmente verifica se um sinal pode ser enviado para o processo. O valor de retorno de kill()
é complexo mas pode ser resumido a isto: Um valor de 0 significa que o processo está ativo e aceitaria sinais de seu processo enquanto um valor de -1 e errno EPERM significa que o processo está ativo mas não aceitando sinais do seu processo.
Alguns exemplos de código C que são verificados uma vez por segundo para verificar se um processo arbitrário desapareceu:
int res = kill(pid, 0);
while (res == 0 || (res < 0 && errno == EPERM))
{
sleep(1);
res = kill(pid, 0);
}
Você também pode experimentar o comando kill
:
kill -0 <pid>
Isso passará pid e 0 em kill()
. Alguns shells têm um kill
integrado, por isso é muito mais eficiente do que iniciar um novo processo (por exemplo, ps
).