Если ваш основной процесс имеет pid A, а B - F - pids подпроцессов, то:
A spawns B i=0
A spawns C i=1
C run from 'fork' i=1
C spawns D i=2
B run from 'fork' i=0
B spawns E i=1
D run from 'fork' i=2
E run from 'fork' i=1
E spawns F i=2
F run from 'fork' i=2
Где i
- значение i
контекста (под) процесса.Поскольку fork
создает точную копию запущенного процесса, переменная i
также будет скопирована.Когда A порождает B, i
равен 0. Когда A порождает C, i
равен 1.Процесс A теперь выходит из цикла for, так как i == 1.
Теперь подпроцесс C начинает работать с i
== 1. Обратите внимание, что он не прервется внутри цикла for, так как fork (), в точке появления C, возвращает 0. Вместо этого он зацикливается, увеличивая i
до 2, порождает D и выходит из-за условия цикла for.
Подпроцесс B имеет i
==0, когда это начинается.Он порождает подпроцесс E и разрывается внутри цикла for.(я == 1)
И так далее ...
Когда вы пытаетесь найти что-то подобное, я могу дать вам совет:
Сделатьпромежуточные переменные и распечатайте их.
Я изменил ваш код, чтобы он выводил на экран то, что я только что описал:
#include <unistd.h>
#include <stdio.h>
int main(void) {
int i;
for (i= 0; i < 3; ++i) {
int f = fork();
printf("%i\tspawns\t%i\ti=%i\n", getpid(), f, i);
if (f && (i == 1))
break;
}
getchar();
}