fork
возвращает -1 в случае ошибки и 0 или в положительном случае, поэтому строка if (pid < 0) break;
говорит: «если произошла ошибка, выйдите из цикла».
Предполагая, что нет ошибки, это что-то вроде:
В начале i=0
, и у вас есть один процесс. давайте назовем это p0
.
В строке fork();
, p0
создает другой процесс. давайте назовем это p1
.
В каждом из них у нас есть i++
(так что теперь i
равно 1), и мы снова повторяем цикл.
p0
и p1
по отдельности имеют команду fork();
, поэтому каждый из них создает другой процесс. давайте назовем новые процессы p2
и p3
.
Теперь в каждом процессе у нас есть i++
, который устанавливает i
равным 2, и мы снова запускаем цикл.
Каждый из 4 процессов, которые у нас есть, запускает строку fork();
и создает новый процесс. так что теперь у нас есть также p4
, p5
, p6
, p7
.
Каждый процесс увеличивает его i
до 3, а затем, поскольку условие цикла теперь ложно, цикл, наконец, заканчивается.
Теперь процесс 8 (отдельно) переходит на следующую строку.
(Фактически, каждая итерация удваивает число процессов, поэтому если вы измените 3
, например, 15
, у вас будет 2 ^ 15 процессов в конце.)