E 'qualcosa di simile ...
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
... ecc
L'ordine che i processi in uscita, tuttavia, sono indeterminati, quindi probabilmente non vedrai lo stesso identico output ogni volta, e anche se lo fai non è qualcosa che puoi garantire.
Come hanno detto altre persone, ogni processo ha una propria "i" globale di cui tiene traccia e il suo valore è semplicemente il valore del processo di forking al bivio.
Non ci hai detto cosa non ti piace di questo. – bmargulies
Non mi piace perché non capisco quando stiamo incrementando il fork sul processo padre o nei processi figli. Normalmente se vogliamo incrementare nel processo figlio lo facciamo se (fork() == 0) ++ i; ma quando facciamo una forchetta come questa, mi sento un po 'perso nel mezzo! – Bruno
Come per ogni risposta: il bambino incrementa il figlio, il genitore incrementa il genitore, mai il twain lo farà. – bmargulies