Я пытаюсь понять поведение fork()
. На этот раз в for-loop
. Соблюдайте следующий код:
#include <stdio.h>
void main()
{
int i;
for (i=0;i<3;i++)
{
fork();
// This printf statement is for debugging purposes
// getppid(): gets the parent process-id
// getpid(): get child process-id
printf("[%d] [%d] i=%d\n", getppid(), getpid(), i);
}
printf("[%d] [%d] hi\n", getppid(), getpid());
}
Вот результат:
[6909][6936] i=0
[6909][6936] i=1
[6936][6938] i=1
[6909][6936] i=2
[6909][6936] hi
[6936][6938] i=2
[6936][6938] hi
[6938][6940] i=2
[6938][6940] hi
[1][6937] i=0
[1][6939] i=2
[1][6939] hi
[1][6937] i=1
[6937][6941] i=1
[1][6937] i=2
[1][6937] hi
[6937][6941] i=2
[6937][6941] hi
[6937][6942] i=2
[6937][6942] hi
[1][6943] i=2
[1][6943] hi
Я очень визуальный человек, и поэтому единственный способ для меня понять вещи - это диаграмма. Мой инструктор сказал, что будет 8 привет заявлений. Я написал и запустил код, и действительно было 8 привет. Но я действительно этого не понимал. Поэтому я нарисовал следующую диаграмму:
Диаграмма обновлена, чтобы отразить комментарии:)
Замечания:
- Родительский процесс (основной) должен повторять цикл 3 раза. Затем printf вызывается
- На каждой итерации родительского цикла fork() называется
- После каждого вызова fork() я увеличивается, и поэтому каждый дочерний элемент запускает цикл for из цикла я до того, как он будет увеличен.
- В конце каждого цикла for-loop печатается "hi"
Вот мои вопросы:
- Является ли моя диаграмма правильной?
- Почему на выходе есть два экземпляра
i=0
? - Какое значение
i
переносится на каждый дочерний элемент после fork()? Если переносится одно и то же значениеi
, тогда, когда останавливается "разветвление"? - Всегда ли
2^n - 1
способ подсчета числа детей, которые разветвляются? Итак, здесьn=3
, что означает2^3 - 1 = 8 - 1 = 7
детей, что правильно?