fork
inicia um processo em segundo plano. Quando o processo em primeiro plano (aquele que chama fork
) termina, o shell de chamada é notificado e mostra um novo prompt. O shell é o pai do processo original em primeiro plano; não é o pai de qualquer processo bifurcado.
A ordem em que o processo original e o processo bifurcado são executados não é fixa, mas é improvável que se desvie de maneira relevante devido ao atraso de 2 segundos. Em seu teste, acontece que a linha do tempo era:
-
fork
o primeiro filho do processo original. -
fork
o segundo filho do primeiro filho. - O processo original imprime o
waitid
trace e inicia a chamadawaitpid
para aguardar o primeiro filho. - O primeiro filho imprime seu
exit
trace e sai. - O processo original é notificado da morte do processo filho e sua
waitpid
retornos de chamada. - O processo original imprime seu
will exit
trace. - O shell é notificado de que o processo original foi encerrado e imprime seu prompt.
- Um pouco menos de dois segundos depois, a chamada
sleep
no segundo filho é concluída e o segundo filho imprime seuhas parent
trace.
O shell não recebe qualquer notificação do último evento, porque não é o pai do processo de morrer. De qualquer forma, ele já está sendo exibido e está aguardando que você digite um novo comando; não teria motivos para fazer nada (se você estivesse digitando um comando, isso poderia ser prejudicial).