Você precisa chamar wait()
no pai para bloquear até que o filho seja morto
Veja: link
Eu tenho aprendido sobre processos UNIX e não consegui entender um ponto. Digamos que temos código assim,
void fork_child()
{
if (fork() == 0) {
/* Child */
printf("Running Child, PID = %d\n",
getpid());
while (1)
; /* Infinite loop */
} else {
/* Parent */
printf("Terminating Parent, PID = %d\n",
getpid());
exit(0);
}
}
Eu sei que nós matamos o processo filho explicitamente porque o pai morre antes, mas quando eu executo o código, o shell não espera pelo loop while no processo filho, é mais como executar em segundo plano. Qual é o principal motivo deste problema?
Obrigado
Você precisa chamar wait()
no pai para bloquear até que o filho seja morto
Veja: link
O shell em si não conhece realmente os filhos dos processos iniciados. Digamos que o shell inicie o processo A, que então inicia o processo B e depois A sai. O que acontece agora é que B continua rodando, mas é feito filho de init
, PID 1. Ele não se torna filho do shell.
_exit(2)
man page no Linux (há texto similar em POSIX ):
Any children of the process are inherited by
init(1)
. The process's parent is sent aSIGCHLD
signal.
Ter processos sem pai herdados por seus avós não seria uma boa ideia, já que o novo pai precisaria ser responsável por receber SIGCHLD
sinais de e chamando wait()
no filho. Qualquer programa que executasse qualquer outro programa precisaria estar preparado para lidar com quantidades arbitrárias de crianças.
Naturalmente, se a criança estiver segurando um tubo, a casca ainda está lendo, por exemplo, a partir da substituição de comandos, então o shell terá que esperar, já que ele pode saber que recebeu todas as entradas somente após o fechamento do pipe.