2012-02-15 4 views
8

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

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

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

(А) 3. (В) 4. (С) 7. (D) 8.

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

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

подействовать ответ (без каких-либо объяснений) от тренерских институтов были (C) 7.

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

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

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

+3

Дочерние процессы, созданные с помощью первого процесса перейти к 'вилке()' сами. Вы тоже должны это считать. –

+1

Нет, forking - это концепция ОС - язык программирования не имеет значения. – Rup

+2

Это показывает, почему вопросы с множественным выбором являются дьявольскими для демонстрации понимания. Если бы вам пришлось написать ответ, объясняющий, как вы пришли к ответу, вы можете получить кредит за понимание понятий, даже если вы пришли к другому выводу из «официального ответа». Например, учитываются ли дети дочерних процессов? Он меняет ответ, который нужно дать. –

ответ

26

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

enter image description here

+2

Хорошая работа на диаграмме. –

+0

@JonathanLeffler Хе-хе спасибо, и хорошая работа по вашему ответу, ведь это более подробно! –

+1

@eznme «из этой точки в коде» означает ли это, что после второго вилка ребенок и родитель будут продолжать выполнение из следующей строки, которая является третьей операцией fork()? –

15

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

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

Официальный ответ от iit вышел несколько дней назад. Правильный ответ - 7. К сожалению, они не дали полного набора решений, просто ответы. –

3

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

+0

, поэтому на диаграмме выше дети - это 8 листьев внизу, а корневой узел - родительский. ответ должен быть 8. –

+2

@AbhinavKulshreshtha: На диаграмме выше самая левая вертикальная линия - это исходный процесс и * не * ребенок, созданный любым из 'fork()' в примере. Он * является дочерним элементом какого-либо другого процесса, но я бы не счел его созданным 'fork(); вилка(); fork() ' –

+0

Официальный ответ вышел до 7. Они не предоставили полное решение, но на этой странице ваше объяснение вместе с диаграммой @eznme является самым простым. спасибо –

4

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

printf("initial pid: %d\n", (int)getpid()); 
fork(); 
fork(); 
fork(); 
printf("final pid: %d\n", (int)getpid()); 
+0

У меня ошибка компоновщика для _getpid и _fork. Это код я использовал '#include #include силы основных() { Е ("Начальный PID:% d \ N", (INT) GETPID()); fork(); fork(); fork(); getch(); } ' –

+0

Я использую turbo C++ 3.1 под эмуляцией dosbox, в Windows 7 –

+2

Ни DOS, ни Windows не имеют' fork() '. Вы не можете попробовать этот фрагмент в этих операционных системах. Я не знаю, как сделать то же самое в DOS; вы можете попробовать [CreateProcess()] (http://msdn.microsoft.com/en-us/library/windows/desktop/ms682425%28v%3Dvs.85%29.aspx) в Windows (что не совсем похоже на ' вилка() '). – pmg

Смежные вопросы