1. Este site usa cookies. Ao continuar a usar este site está a concordar com o nosso uso de cookies. Saber Mais.

Duvida - fork

Discussão em 'Programação' iniciada por TheRunner, 19 de Junho de 2008. (Respostas: 7; Visualizações: 1002)

  1. TheRunner

    TheRunner Power Member

    Boas pessoal

    Vou ter exame de SO e não entendo bem o funcionamento da função fork. Sei que cria um processo filho exactamente igual ao do pai e que apenas diferem no valor de retorno senão me engano. Contudo estou a ver os exames do ano passado e precisava da vossa ajuda...

    Código:
    int contador=0; 
    int main(int argc, char *argv[]) { 
    fork(); 
    contador++; 
    fork(); 
    contador++; 
    printf("valor de contador: %d\n", contador); 
    }
    a) Quantos processos são criados durante a execução deste programa ?

    Pelo que me parece são criados dois novos processos. Estou errado?

    b) Indique os resultados que são escritos em stdout.

    Valor de contador: 2

    Corri o programa e no entanto o resultado foi este:

    Valor de contador: 2
    Valor de contador: 2
    Valor de contador: 2
    Valor de contador: 2

    Para compilar o programa apenas acrescentei #include <stdio.h> #include <sys/types.h>.

    É o meu raciocinio que está errado ou estou a fazer alguma coisa de errado a compilar o programa?

    Se me pudessem responder a estas duas perguntas agradecia :)
     
  2. São criados três novos processos. No primeiro fork é criado um novo processo (ficando com 2), logo o segundo fork vai ser executando duas vezes.
     
  3. TheRunner

    TheRunner Power Member

    Também já tinha pensado nessa solução. Obrigado ;)

    Mas então o stdout do programa não deveria ser diferente?
     
  4. Cada processo é uma cópia exacta do processo que o cria, logo as variáveis têm o mesmo valor que tinham no processo original.
     
  5. TheRunner

    TheRunner Power Member

    Desculpa mas continuo sem entender :s

    Porque é que ele repete 4 vezes o printf? Para mim não faz sentido :s
     
  6. Cada processo corre o printf uma vez.
     
  7. Mr_Miguel

    Mr_Miguel Power Member

    É criado:

    -Um processo para executar a função main()
    -Um processo adicional no primeiro fork()
    -Existem agora dois processos. Cada um deles vai chamar o segundo fork(), dando portanto origem a mais dois.

    Total: 4 processos.

    Quanto ao valor do contador:

    -Um processo executa a função main. Antes do fork(), contador = 0
    -Depois do fork(), existe um contador para o processo anterior (P1) e um contador para o processo adicional criado (P2), ambos com o valor 0 (isto é: contador P1 = 0 contador P2 = 0), pois um fork() implica cópia de variáveis.
    -Cada um dos processos executa o primeiro contador++, que vai alterar o valor do seu (e só do seu) contador (isto é: contador P1 = 1 contador P2 = 1)
    -P1 e P2 executam o segundo fork(), copiando as suas variáveis para P3 e P4. (contador P1 = 1 contador P2 = 1 contador P3 = 1 contador P4 = 1)
    -Os quatro processos executam o segundo contador++ (contador P1 = 2 contador P2 = 2 contador P3 = 2 contador P4 = 2)
    -Finalmente, executam o printf. Efectivamente, o resultado que apresentaste está correcto.
     
  8. TheRunner

    TheRunner Power Member

    Obrigado aos dois :)

    Mas a tua explicação Miguel foi do melhor obrigado mesmo ;)
     

Partilhar esta Página