У вас есть 8 выполняемых процессов, просто некоторые из них печатаются более одного раза из-за цикла.
Если вы сортируете вывод:
You are in Parent: 30410
You are in Parent: 30410
You are in Parent: 30410
You are in Parent: 30411
You are in Parent: 30411
You are in Child: 30411
You are in Parent: 30412
You are in Child: 30412
You are in Parent: 30413
You are in Child: 30413
You are in Child: 30414
You are in Child: 30415
You are in Child: 30416
You are in Child: 30417
тогда вы можете видеть, что существует только 8 уникальных идентификаторов процессов.
Причина этого неуловима.Поскольку дочерний процесс наследует (почти) все от родительского, он также получает текущее состояние цикла.Я говорю «почти», поскольку некоторые вещи разные, такие как PID (очевидно), PID родительского (одинаково очевидно) и определенные ограничения ресурсов (в зависимости от ОС).
Итак, процесс 0, когда i == 0
раздваивается на две части.оба с их следующим циклом в i == 1
.Оба они разветвляются со своим следующим циклом на i == 2
.И так далее.
Если вы изучите следующую диаграмму, вы сможете увидеть процесс создания.
____A____
/ | \
B_ C_ D
| \ \
E F G
\
H
Линии /
, |
и \
представляют собой вилки в точках, где i
равно 0
, 1
и 2
соответственно.
Обратите внимание, что процесс (такой как E
), который был создан из родительского элемента, где i == 1
будет работать только с i == 2
.Другими словами, он был создан с помощью |
, поэтому его следующим шагом будет \
.
Аналогично, B
, который был создан с помощью /
(i == 0
), будет только разветвляться с |
(i == 1
) и \
(i == 2
).
Если вас интересует другая информация о форке, см. Мое обширное эссе здесь и некоторые подробности овнутренности различных вариантов форка под Linux здесь .