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) é que fork()
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);
depois printf()
.