Sou novo em sistemas operacionais e Linux, portanto, essa pode ser uma pergunta muito básica, mas não consigo encontrar uma resposta.
De acordo com os recursos que li até agora, o fork()
método cria um novo processo gerando uma chamada de sistema para o sistema operacional. O processo criado é uma cópia exata do processo de chamada.
No entanto, acho que o processo criado (filho) e o processo de chamada (pai) não são exatamente os mesmos. Os códigos que vêm antes do fork()
método no processo pai não são copiados para o processo filho.
#include <stdio.h>
#include <unistd.h>
#include <sys/wait.h>
int main(void){
X
int child1 = fork();
A
B
C
D
int child2 = fork();
E
F
return 0;
}
O processo child2 não contém as linhas de código ABCD, enquanto o processo child1 contém todas as linhas, exceto X. Na verdade, esse é o meu pensamento. Por outro lado, em todos os lugares, diz-se que o processo filho é uma cópia exata do processo pai.
Alguém pode dizer qual é a verdade?
fork()
"retorna duas vezes". No processo pai, retorna o PID do filho. No processo filho, retorna zero. Isso supõe que não houve erros. Isso significa que seu código, fazendo duas bifurcações, resultará em um total de quatro processos.Os processos são idênticos em todos os aspectos, exceto nos modos descritos em
fork(2)
(man 2 fork
).Por exemplo, no código
as instruções
A
e serão executadas por um número cada vez maior de processos (na verdade, não escreva um código como este, pois pode travar o sistema).B
C
No seu exemplo, as instruções também existirão para execução pelos processos filhos, mas não há nenhum caminho de código que leve de volta a essas instruções. O processo filho, por ser idêntico ao pai no momento da chamada para
fork()
, começará a ser executado no ponto do código em quefork()
foi chamado.