Quando você está em fork()
, o código em execução é executado em dois processos (supondo que a bifurcação seja bem-sucedida): um processo é o pai, o outro é o filho. fork()
retorna 0 no processo filho e o filho pid no processo pai: é totalmente determinista.
Assim, você pode determinar, após o fork()
, se está executando no pai ou no filho. (E também como o pai conhece o filho pid - ele precisa esperar por ele em algum momento.)
Mais detalhadamente:
- o processo pai futuro chama
fork()
; - o kernel cria um novo processo, que é o filho, e configura várias coisas apropriadamente - mas ambos os processos estão executando o mesmo código e estão "aguardando" por um retorno da mesma função;
-
ambos os processos continuam sendo executados (não necessariamente de imediato, e não necessariamente simultaneamente, mas isso é além do ponto):
-
fork()
retorna 0 para o processo filho, que continua e usa essas informações para determinar que é o filho; -
fork()
retorna o pid filho para o processo pai, que continua e usa essas informações para determinar que é o pai.
-