Помогите с выводом, сгенерированным этим кодом C, используя fork () - PullRequest
0 голосов
/ 13 апреля 2010

Я пытаюсь выяснить вывод для блока кода C, используя fork (), и у меня возникают некоторые проблемы с пониманием того, почему это получается так, как это происходит. Я понимаю, что при использовании fork () он параллельно запускает другой экземпляр программы и что дочерний экземпляр возвращает 0. Может ли кто-нибудь шаг за шагом объяснить вывод в блок кода ниже? Спасибо. РЕДАКТИРОВАТЬ: Я забыл добавить выход (1) после цикла. Мои извинения.

main() { int status, i;
         for (i=0; i<2; ++i){
             printf("At the top of pass %d\n", i);
             if (fork() == 0){
                printf("this is a child, i=%d\n", i);
             } else {
                 wait(&status);
                 printf("This is a parent, i=%d\n", i);
               }
          }
          exit(1);
}

Ответы [ 2 ]

1 голос
/ 13 апреля 2010

Что происходит в первом цикле, так это то, что первый процесс разветвляется. В одном случае fork() возвращает 0, а в другом - pid дочернего процесса. Таким образом, вы получите тот, который печатает «это дочерний процесс», а другой - «это родитель». Оба эти процесса продолжаются через цикл, увеличивая значения i до 1 и fork() снова. Теперь у вас есть четыре процесса: двое детей и двое родителей. Все четыре процесса будут увеличивать i до 2 и выходить из цикла.

Если вы повысили условие завершения цикла до i<3, то в следующий раз во время цикла все четыре процесса будут выполняться fork(), и у вас будет всего восемь процессов. Если бы в цикле не было ограничений, у вас была бы форковая бомба , в которой вы просто экспоненциально создавали бы все больше и больше процессов в каждом цикле, пока в системе не закончатся ресурсы.

0 голосов
/ 13 апреля 2010

Этот код может быть сложно объяснить. Причина в том, что первый потомок не выходит и сам вызовет fork. Попробуйте изменить код, включив в каждую строку печати идентификатор процесса, например:

printf("At the top of pass %d in pid %u\n", i, getpid());

Тогда обратите внимание, как ребенок становится родителем ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...