Here’s how to understand it, starting at the for loop.
-
Loop starts in parent,
i == 0 -
Parent
fork()s, creating child 1. -
You now have two processes. Both print
i=0. -
Loop restarts in both processes, now
i == 1. -
Parent and child 1
fork(), creating children 2 and 3. -
You now have four processes. All four print
i=1. -
Loop restarts in all four processes, now
i == 2. -
Parent and children 1 through 3 all
fork(), creating children 4 through 7. -
You now have eight processes. All eight print
i=2. -
Loop restarts in all eight processes, now
i == 3. -
Loop terminates in all eight processes, as
i < 3is no longer true. -
All eight processes print
hi. -
All eight processes terminate.
So you get 0 printed two times, 1 printed four times, 2 printed 8 times, and hi printed 8 times.