Resultado de um pequeno programa de C
Pergunta
Precisamos dizer o resultado da seguinte programa C:
main()
{
int pid, k, som;
som = 0; k = 2;
pid = fork();
if(pid == 0)
k=5;
else
wait(0);
for(int i = 1; i <= k; i++)
som += i;
printf("%d", som);
}
A minha primeira expectativa é 3. Quando uma chamada do garfo é feito, a memória do processo é copiado, e ambos os programas vão correndo. O processo filho, em seguida, executa, mas ainda k é igual a 2. Assim, no final, ele executa 1 + 2 = 3;
Mas quando este programa é executado, ele envia 153. Não tenho a pista mais próxima porque ele gera isso.
Alguém pode dizer por quê?
Solução
A razão por que é que você tem 2 processos de impressão para o mesmo console. "Fork" é um comando unix / linux que é chamado uma vez e volta duas vezes. Um dos retornos serão no processo original que chamou garfo e irá retornar o PID do processo filho que foi gerado. O segundo retorno será 0 e isso indica que é o processo filho.
Um dos programas, a criança eu acredito, executa primeiro e calcula 15 como o valor e imprime-lo para o console passado. O programa principal executa segunda por causa da espera (0) e produz o valor 3.
Outras dicas
15
é impresso pela criança, e 3
pelo pai.
A é pai, B é a criança, aqui estão as linhas importantes:
A: pid = fork(); // returns 0 for the child process
A: wait(0);
B: k = 5;
B: for(int i = 1; i <= k; i++) som += i; // som = 15
B: printf("%d", som); // prints 15, B finishes, goes back to A
A: for(int i = 1; i <= k; i++) som += i; // som = 3
A: printf("%d", som); // prints 3
Não há nenhuma nova linha a ser impresso entre os valores de modo a resposta do pai aparece logo após a resposta da criança.
O correto sobre a causa dos valores Jared.