2013-06-22 2 views
3

Я пытаюсь выяснить, сколько процессов создает эта программа, включая исходный родительский процесс. Правильный ответ должен быть 9, но я не понимаю, почему ответ 9. Как создаются эти 9 процессов? Заранее спасибо!Сколько процессов создает эта программа, включая исходный родительский процесс?

#include <stdio.h> 
#include <unistd.h> 
… 
int main() 
{ 
    pid_t john; 
    john = fork(); 

    if (john == 0) { 
     fork(); fork(); fork(); 
    } 
/* Consume resources of another process */ 
/* This does NOT create a new process. */ 
Consume(); Consume(); 

    return 0; 
} 
+0

Откуда берется 'Consume()' и что он делает? – zmo

+0

нарисовать дерево. см. http://stackoverflow.com/questions/7091918/confused-with-output-of-fork-system-call –

+0

@zmo Все, что я знаю, это то, что он потребляет ресурсы другого процесса, скажем Doe.c, и doesn ' t создать новый процесс. Этот фрагмент из старого экзамена, который я репетирую, поэтому у меня нет дополнительной справочной информации. – Freek

ответ

6
john = fork(); //fork a new process, we have 2 now. 

    if (john == 0) {// child process go in the if statement 
     fork(); //child process fork to 2 processes 
     fork(); //2 processes continue to fork,so we have 2 more. 
     fork(); //4 processes continue to fork, so we have 4 more. 
    } 
    //up to here, the child process of the first fork is now 8 processes 
    //adding the first parent process, that is 9 in total. 
+0

Спасибо, теперь я полностью понимаю, почему, как и когда создаются процессы! – Freek

0

P1 вилки, создающие P2. P1 имеет john = <NOT ZERO>, а P2 имеет john = 0. Следовательно, P2 выполняет команду if. Это вилки, создающие P3. Теперь P2 и P3 находятся на второй вилке. Поэтому они развивают, создавая P4 и P5. Теперь P2, P3, P4 и P5 имеют одну левую вилку. Они развивают, создавая P6, P7, P8 и P9. Всего было создано девять процессов.

fork создает точную копию образа программы вызывающего процесса, за исключением того факта, что он возвращает 0 дочернему элементу и PID родительскому. И ребенок будет на том же месте, что и родитель, после вилки.

+0

Спасибо за объяснение! – Freek

8

Помните, что на fork();fork();fork(); родитель и ребенок попали в следующую вилку.

main 
| 
|\   john = fork() 
| \ 
| \ 
| |\    fork() 
| | \-----\ 
| |\  |\  fork() 
| | \  | \ 
| | \ | \ 
| | \ | \ 
| |\ |\ |\ |\ fork() 
| | | | | | | | | 
1 2 3 4 5 6 7 8 9 
+0

Спасибо за дерево, высоко ценим! – Freek

0

Друг, я тоже изучаю процесс. И у меня есть кое-что о функции fork(). Вы знаете, что fork создаст новый дочерний процесс, и он получит копию данных, содержимого, стека, кучи и т. Д. Из родительского процесса, а дочерний процесс также получит копию PCB из родительского процесса. Запуск программы контролируется счетчиком программ, который содержит инструкции программы. PCB содержит информацию о программном счетчике. Из-за того же PCB между дочерним и родительским дочерним процессом будут выполняться левые инструкции счетчика программ, поэтому в родительском процессе код перед fork не будет запущен в дочернем. В операторе if, когда первый запуск вилки, дочерний процесс будет запускать только вторую и третью вилки. вы можете использовать это, чтобы нарисовать диаграмму процессов, чтобы помочь вам решить этот вопрос. Подобно этому. Корреспондент, у меня нет репутации репутации для публикации изображений для вас. Надеюсь, мои слова помогут вам.