fork () в C-программе - PullRequest
       25

fork () в C-программе

8 голосов
/ 15 февраля 2012

Это вопрос недавнего вступительного экзамена GATE.
Процесс выполняет код

fork();  
fork();  
fork();  

Общее число созданных дочерних процессов

(A) 3. (B) 4. (C) 7. (D) 8.

Мой ответ был (A) 3.

На мой взгляд, после каждого fork () будет создан 1 дочерний процесс, и выполнение parent будет продолжаться в обычном режиме.

Ненадежный ответ (без каких-либо объяснений) от коучинговых институтов был (C) 7.

Я думаю, они считают, что каждая ветвь создаст дочерний процесс и новыйродительский процесс.И они также считают весь родительский процесс. [Мне не разрешено публиковать изображения, но мой друг объяснил на диаграмме дерево с каждым левым узлом в двух узлах.Поэтому 4 родительских узла слева и 3 дочерних узла справа.] Но в Вопросе четко упоминается только дочерний процесс.И также я не думаю, что родительский процесс заново создан в разветвлении.

Может кто-нибудь объяснить некоторые основы разветвления и правильное решение вышеуказанного вопроса, пожалуйста.

PS Если язык программирования имеет какое-либо значение в понятии разветвления, то, согласно программе, это должно быть либо Cили C ++ программа.

Ответы [ 5 ]

25 голосов
/ 15 февраля 2012

fork() приводит к тому, что исходный процесс и один дочерний процесс начинают с этой точки в коде .Поэтому у вас есть эта картинка:

enter image description here

15 голосов
/ 15 февраля 2012

Я думаю, что всего 8 процессов, или 7 потомков оригинала, или 3 прямых потомка оригинала (остальные - внуки и пра-внуки).

  • После первого fork(), при условии отсутствия сбоев (повсюду), есть два процесса.
  • Каждый из них снова выполняет fork() - так что теперь есть четыре процесса.
  • Каждый из нихвыполняет fork() еще раз - так что теперь есть восемь процессов.
4 голосов
/ 15 февраля 2012

Попробуйте это:

printf("initial pid: %d\n", (int)getpid());
fork();
fork();
fork();
printf("final pid: %d\n", (int)getpid());
3 голосов
/ 15 февраля 2012

После каждого вызова fork происходит два процесса, родительский и дочерний. И оба этих процессов продолжают выполняться сразу после разветвления. Некоторые из возникающих процессов - это (после всего разветвления) как родители, так и дети. Те, которые являются только дочерними, являются листьями дерева процессов. Тот (исходный), который является только родителем, является корнем дерева. Родителями и детьми являются ветви .

0 голосов
/ 11 сентября 2018

Для этого типа вопросов можно использовать обобщенную формулу,

Общее количество процессов будет 2 ^ n.

Формула для получения общего числа созданных дочерних процессов: (2 ^ n) - 1, где n - количество вызовов функции fork.

Здесь fork () вызывается 3 раза, поэтому число дочерних процессов будет (2 ^ 3) - 1 = 7. Всего 7 дочерних процессов и 1 родительский процесс.

...