
Ao executar a fork
chamada 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 fork
retorna sempre child
ou 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.