2016-02-26 2 views
-1

Я пытаюсь создать 5 детей и 1 родителя. Но родитель создаст их (по крайней мере 4 из них. Потому что сначала нам нужно развить), но он создает группу детей. Не могу найти, что я делаю неправильно. Любая идея, пожалуйста?Несколько вилок не работают

child0=fork();//first process 
if(child0>0)//Parent 
{ 

    //Create children 
    child1=fork(); 
    child2=fork(); 
    child3=fork(); 
    child4=fork(); 
    cout<<"i am child 0 "<<child0 <<" "; 
    cout<<"i am child 1 "<<child1; 
    cout<<"i am child 2 "<<child2; 
    cout<<"i am child 3 "<<child3; 
    cout<<"i am child 4 "<<child4; 
    wait(child0); 
    wait(child1); 
    wait(child2); 
    wait(child3); 
    wait(child4); 
} 
else if(child0<0) 
{ 
    printf("fork() failed!\n"); 
    exit(1); 
} 
else 
{ 
cout<<"i am child0"; 
    exit(0); 
} 
+0

Вы выполняете много разветвления без проверки возвращенного идентификатора. многие дети также разводят больше детей. – AndyG

ответ

4

После каждой вилки вы удваиваете число процессии. Ваш код:

child1=fork(); // we have two now 
child2=fork(); // each one of them forks - we have 4 
child3=fork(); // 8 
child4=fork(); // 16 

Вам необходимо проверить возвращаемое значение вилки. Когда он не равен 0, вы находитесь в родительском элементе и снова можете разблокировать. Если это 0, вы являетесь ребенком, и вы не должны fork() - должны выполнять ваши детские дела.

И пока вы проверяете возвращаемое значение, вы также можете проверить его на -1 - это означает, что fork() не удалось. Как ни странно, как мне кажется, я знаю производственную систему, где это произошло.

0

Всегда помните - когда вы делаете fork(), как дочерние, так и родительские снова запускают выполнение из следующей строки инструкции fork(). fork() возвращает 0 в дочернем процессе и PID дочернего элемента в родительском процессе. Следовательно, в вашем случае ребенок и родитель, оба из них снова вилка. Вы создаете дерево процессов.

Так что таким образом

int pid; 
if((pid=fork())==0) 
{ 
    // Child Process 
    printf("I'm child"); 
} 
else 
{ 
    // Parent process 
    // Again do fork() here 
} 
Смежные вопросы