2015-02-03 3 views
0

Я еще не понял, как работает fork(). Интересно, как я могу сделать родительский процесс, например, несколькими детьми?Как работает fork(), если я хочу создать несколько дочерних элементов для одного и того же родителя?

fork(); 
fork(); 

будет ли это возвращать родителя с двумя детьми? первый fork() = parent + child, второй fork() = idk?

+0

читать [Advanced Linux Программирование] (HTTP: // advancedlinuxprogramming.com/) –

ответ

2

В общей сложности это 4 процесса.

Основной процесс будет раскошелиться один с первым fork();

На втором fork(); оба предыдущих будут создавать новые процессы, которые действительно делают 2x2=4.

3

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

Так что, если вы fork() дважды:

fork(); 
fork(); 

Тогда что произойдет это - первый вилка разделится parent в parent + child.

второй вилка будет разделяться как на две части, так и на другую. Предоставление вам:

parent 
+ - child 
    + - child 
+ - child 

Чтобы избежать этого, необходимо проверить код возврата fork() и использовать код возврата, чтобы решить, если вы все еще в parent. Это не обязательно плохо, но вам нужно знать, что это произойдет, и убедитесь, что вы справляетесь, например. сигналы, коды возврата, waitpids и т. д. соответственно. Итак, обычно вы сделаете fork ing только от родителя.

2

fork() возвращает идентификатор процесса дочернего процесса родительскому или ноль для ребенка. Итак:

if(fork() != 0) // create a child 
{ 
    // we are in parent 
    if(fork() != 0) // create another child 
    { 
     // we are in parent 
    } 
    else 
    { 
     // we are in the 2nd child 
    } 
} 
else 
{ 
    // we are in the 1st child 
} 

Вы также можете создать дочерний процесс от дочернего процесса:

if(fork() != 0) // create a child 
{ 
    // we are in parent 
} 
else 
{ 
    // we are in the child 
    if(fork() != 0) // create a grand-child 
    { 
     // we are in a first child 
    } 
    else 
    { 
     // we are in the grand-child 
    } 
} 

Чтобы создать 5 детей:

// describe the work for 5 children 
SomeWorkDescription tab[ 5 ]; 

int childCnt; 

for(childCnt = 0; childCnt < 5; childCnt ++) 
{ 
    if(fork() == 0) 
    { 
     // we are in a child - take a description 
     // of what should be done and go 
     doSomeChildWork(tab[childCnt]); 

     // it's the parent's loop, children do not iterate here 
     break; 
    } 
    // else we are in a parent - continue forking 
} 
+0

Дает решение, но прямо не отвечает на вопрос о коде OP. – Chnossos

+0

Да, да. Вопрос: «Интересно, как я могу сделать родительский процесс, например, несколькими детьми?». Пример показывает, как он может. – CiaPan

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