Es algo así como ...
1 (main) instance, i = 0(unforked)
fork() > 2 instances, with i's = 0(forked), and 0(forked)
0 output from main instance, increments its i, 2 instances with i = 1u, 0f
main instance forks, there's 3 instances with i's 1f, 1f, 0f
1 output from main instance, increments its i, 3 instances with i = 2u, 1f, 0f
main instance forks, there's 4 instances with i's 2f, 2f, 1f, 0f
2 output from main instance, increments its i, 4 instances with i = 3u, 2f, 1f, 0f
main instance then dies, 3 instances with i = 2f, 1f, 0f
2 output from next instance, increments its i, 3 instances with i = 3u, 1f, 0f
next instance then dies, 2 instances with i = 1f, 0f
1 output from next instance, increments its i to 2, 2 instances with i = 2u, 0f
... etc
El orden en que Sin embargo, los procesos están generando resultados indeterminados, por lo que es probable que no veas el mismo resultado cada vez, e incluso si lo haces no es algo que puedas garantizar.
Como se ha dicho otras personas, cada proceso tiene su propio mundial 'i' que rastrea, y su valor es simplemente el valor de i del proceso de bifurcación en el tenedor.
No nos ha dicho lo que no le gusta de esto. – bmargulies
No me gusta porque no entiendo cuando estamos incrementando el tenedor en el proceso principal o en los procesos de los niños. Normalmente, si queremos incrementar el proceso hijo hacemos if (fork() == 0) ++ i; pero cuando hacemos un fork así, ¡me pierdo un poco en el medio! – Bruno
Según la respuesta: el niño aumenta el hijo, el padre incrementa el padre, nunca el segundo hijo meed. – bmargulies