Dúvida questão 4 Lista 3

5 views
Skip to first unread message

Stefan Teixeira

unread,
Dec 6, 2010, 7:39:42 PM12/6/10
to Comp-Prog
É a questão do fork, não entendi o que o código faz, alguém sabe? Tem que dizer o que vai ser impresso...

int main () {
    int x = 0;
    if (fork() > 0) { x++;
        wait(0); // espera o processo filho terminar
    }
    x++; if (fork() == 0) x++;
    else wait(0); x++;
    printf ("Valor de X: %d\n", x) ;
}

Fernando Silva

unread,
Dec 6, 2010, 7:55:16 PM12/6/10
to comp...@googlegroups.com
Stefan,

Com o fork, o processo que está rodando, gera um outro processo identico a ele(chamamos de processo filho), que copia os valores das instancias no momento em que foi criado, e executa a partir do ponto do fork.

Outro detalhe é que a função fork retorna um valor diferente de 0 para o processo pai, e 0 para o processo criado a partir dele, o processo filho.

Então para ver o resultado dessa questão, vou tentar analisar passo-a-passo para ficar claro:

Começa a rodar o main, temos 1 processo(vou chamar de P1)

1) Ele faz x(P1)=0
2) Ele faz o fork, gerando um subprocesso(vou chamar esse subprocesso de P2)
No caso P2 copia o valor de x, logo, x(P2) = 0
3) O processo P1 entra no if, faz x++, ficando x(P1) = 1 e entra no wait, que faz com que ele fique em estado bloqueado até que o seu subprocesso termine.
OBS: que fique claro que ao fazer o fork, não dá para garantir qual dos processos vai executar primeiro, se é o P1 ou P2. Outra coisa que pode acontecer é que o processador pare um deles no meio e continue o outro, no caso, quando P1 ficar em estado bloqueado, isso não vai mais ocorrer, e ele só voltará a rodar após o termino do P2
4) O processo P2 continua, fazendo x++, ficando x(P2) = 1
5) O processo P2 faz o fork, criando um novo subprocesso P3; P3 recebe o valor da instancia do x do P2, logo x(P3) = 1
6) O processo P2 entra no else, e fica em estado bloqueado esperando P3 terminar
OBS: a mesma coisa que eu falei antes é válida aqui
7) O processo P3 entra no if, faz x++, logo x(P3) = 2
8) O processo P3 faz x++, logo, x(P3) = 3
9) O processo P3 IMPRIME 3
10) O processo P2 continua, fazendo x++, logo x(P2) = 2
11) O processo P2 IMPRIME 2
12) O processo P1 continua, fazendo x++, logo x(P1) = 2
13) O processo P1 executa o fork, cria um novo subprocesso P4, P4 recebe o x de P1, logo, x(P4) = 2
14) O processo P1 entra no else e fica bloqueado
15) O processo P4 entra no if, fazendo x++, logo, x(P4) = 3
16) O processo P4 faz x++, logo, x(P4) = 4
17) O processo P4 IMPRIME 4
18) O processo P1 continua, fazendo x++, logo, x(P1) = 3
19) O processo P1 IMPRIME 3

logo o resultado é:
3
2
4
3

Douglas Coutinho

unread,
Dec 6, 2010, 8:08:18 PM12/6/10
to comp...@googlegroups.com
nesse caso desse algoritmo, a ordem fica assim certinha por causa dos "wait", certo? se ñ tivesse esse comando ia imprimir em ordem aleatória, certo?

Fernando Silva

unread,
Dec 6, 2010, 8:09:05 PM12/6/10
to comp...@googlegroups.com
Sim, sem os wait não tinha como garantir a ordem que iria imprimir
Reply all
Reply to author
Forward
0 new messages