Considere o seguinte trecho de código:
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
int main(void)
{
int i;
for(i = 0; i < 2; i++)
{
fork();
printf(".");
}
return 0;
}
Este programa gera 8 pontos. Como isso pode ser possível? Não deveria haver 6 pontos?
Respostas:
O
fork()
primitivo geralmente amplia a imaginação. Até você ter uma ideia, você deve rastrear no papel o que é cada operação e explicar o número de processos. Não esqueça que fork () cria uma cópia quase perfeita do processo atual. A diferença mais significativa (para a maioria dos propósitos) é quefork()
o valor de retorno difere entre pai e filho. (Como esse código ignora o valor de retorno, não faz diferença.)Então, a princípio, há um processo. Isso cria um segundo processo, que imprime um ponto e um loop. Na segunda iteração, cada um cria outra cópia, para que haja quatro processos imprimam um ponto e depois saiam. Assim, podemos facilmente contabilizar seis pontos, como você espera.
No entanto, o que
printf()
realmente faz é armazenar em buffer sua saída. Portanto, o primeiro ponto de quando havia apenas dois processos não aparece quando escrito. Esses pontos permanecem no buffer - que é duplicado na bifurcação (). Não é até que o processo esteja prestes a sair que o ponto em buffer aparece. Quatro processos imprimindo um ponto no buffer, mais o novo fornece 8 pontos.Se você quiser evitar esse comportamento, ligue para
fflush(stdout);
depoisprintf()
.fonte
fork()
não cria 2 e sai, apenas cria mais 1 processo.Você possui buffers não confirmados nos fluxos de saída . stdout é buffer de linha e o buffer é replicado junto com o restante do processo. Quando o programa termina, o buffer não confirmado é gravado duas vezes (uma vez para cada processo). Ambos usando
e
não exiba o problema.
No seu primeiro exemplo, você cria quatro processos que possuem cada um dos dois pontos no buffer do fluxo de saída. Quando cada fluxo termina, ele libera seu buffer, gerando oito pontos.
fonte
quando i = 0
Processo_1: texto em buffer = 1 ponto
Processo_2 (criado por Processo_1): texto em buffer = 1 ponto
quando i = 1
Processo_3 (criado por Processo_1): Herda 1 ponto em buffer do Processo_1 e imprime 1 ponto sozinho. No total, Process_3 imprime 2 pontos.
Process_4 (criado por Process_2): Herda 1 ponto em buffer do Process_2 e imprime 1 ponto sozinho. No total, Process_4 imprime 2 pontos.
Processo_1: Imprime 2 pontos (um ponto no buffer quando i = 0 e outro ponto quando i = 1)
Processo_2: Imprime 2 pontos (um ponto no buffer quando i = 0 e outro ponto quando i = 1)
Saída final: 8 pontos. :)
fonte