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

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

Ao executar a forkchamada para criar um novo processo, se for bem-sucedido, ele retornará 0(o filho) ou o pai.

Eu não entendi a ideia por trás disso. Por que simplesmente não forkretorna sempre childou sempre parent?

Responder1

Quando você fork(), o código que está sendo executado é executado em dois processos (assumindo que a bifurcação foi bem-sucedida): um processo é o pai e o outro, o filho. fork()retorna 0 no processo filho e o pid filho no processo pai: é totalmente determinístico.

É assim que você pode determinar, após o fork(), se está executando no pai ou no filho. (E também como o pai conhece o pid do filho – ele precisa esperar por ele em algum momento.)

Com um pouco mais de detalhes:

  • as futuras chamadas do processo pai fork();
  • o kernel cria um novo processo, que é o filho, e configura várias coisas apropriadamente - mas ambos os processos estão em execuçãoo mesmo códigoe estão “esperando” o retorno da mesma função;
  • ambos os processos continuam em execução(não necessariamente imediatamente e não necessariamente simultaneamente, mas isso não vem ao caso):
    • fork()retorna 0 para o processo filho, que continua e usa essas informações para determinar que é o filho;
    • fork()retorna o pid filho ao processo pai, que continua e usa essas informações para determinar que é o pai.

Responder2

A fork()chamada do sistema "retorna duas vezes", sempre (a menos que falhe). No pai 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.

informação relacionada