View Full Version : Duvida - fork


iMode
19-06-2008, 20:21
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...

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 :)

Mr. Brightside
19-06-2008, 20:42
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.

iMode
19-06-2008, 20:44
Também já tinha pensado nessa solução. Obrigado ;)

Mas então o stdout do programa não deveria ser diferente?

Mr. Brightside
19-06-2008, 20:47
Também já tinha pensado nessa solução. Obrigado ;)

Mas então o stdout do programa não deveria ser diferente?

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.

iMode
19-06-2008, 21:34
Desculpa mas continuo sem entender :s

Porque é que ele repete 4 vezes o printf? Para mim não faz sentido :s

Mr. Brightside
19-06-2008, 21:36
Desculpa mas continuo sem entender :s

Porque é que ele repete 4 vezes o printf? Para mim não faz sentido :s

Cada processo corre o printf uma vez.

Mr_Miguel
20-06-2008, 18:26
É 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.

iMode
20-06-2008, 20:00
Obrigado aos dois :)

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