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ê?

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top