Por que o fork às vezes retorna pai e algumas vezes filho?

3

Ao executar a chamada fork para criar um novo processo, se tiver êxito, ele retornará 0 (o filho) ou o pai.

Eu não entendi a ideia por trás disso. Por que o fork não retorna sempre child ou sempre parent ?

    
por Makhlouf GHARBI 27.04.2017 / 17:55

2 respostas

11

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.
por 27.04.2017 / 17:57
2

A chamada do sistema fork() "retorna duas vezes", sempre (a menos que falhe). No pai, ele retorna o PID do processo filho e, no filho, retorna zero.

O fluxo normal é

pid_t pid;
int status;

pid = fork();

if (pid == 0) {
  run_child_stuff();
  exit(0);
} else if (pid > 0) {
  run_parent_stuff();
  wait(&status); /* wait for child to exit */
} else {
  /* handle failure to fork */
}

... ou similar.

    
por 27.04.2017 / 17:57

Tags