Когда вы fork
, это похоже на то, что все программы вставляются при копировании, и с этого момента запускаются два идентичных процесса (хотя отец получает идентификатор ребенка в качестве возвращаемого значения fork
, а ребенок получает ноль)
Итак, что происходит с i
, так это то, что у него будет точно такое же значение в дочернем элементе, какое у родительского элемента во время разветвления.
Итак, когда i
равно 2:
for parent: i>=1 && !fork() <-- fails
for child1: i>=1 && !fork() <-- succeeds
Итак, дочерний элемент исходной программы печатает 2.
Теперь родительский объект завершен, а дочерний элемент 1 запущен.Он выполняет i--
, и теперь i
равен 1:
for child1: i>=1 && !fork() <-- fails
for child1.1: i>=1 && !fork() <-- succeeds
Итак, снова child1 завершает работу и его дочерний элемент child1.1 отправляется в for и печатает 1. Затем он выполняет i--
и i
становится 0, что не удается i>=1
и из-за оценка короткого замыкания , fork
не выполняется.Этот child1.1 также завершается.
Чтобы ответить на ваш последний вопрос, обычно так пишется fork
:
pid_t pid = fork();
if (pid)
{
// in parent
}
else
{
// in child
}
Теперь все, что вам нужно, это цикл for:
#include <unistd.h>
#include <stdlib.h>
int main(){
int i;
for(i=2;i>=1;i--)
if (fork())
break; /* parent wants to break */
else
printf("%d\n",i); /* child prints something */
exit(EXIT_SUCCESS);
}