2014-10-29 3 views
1

Может кто-нибудь объяснить, почему вывод такой? Я очень смущен тем, как эти процессы выполняются (в каком порядке?), А также около waitpid()/wait(). Вот код:Как работает wait() в Linux?

#include<stdio.h> 
main() 
{ 
    int pid1, pid2, pid3; 
    pid1=fork(); 
    if(pid1 == 0){ 
     printf("PID of child 1 is :%d\n",getpid()); 
     //sleep(2); 
    } 
    pid2=fork(); 
    if(pid2 == 0){ 
     printf("PID of child 2 is :%d\n",getpid()); 
     //sleep(2); 
    } 
    pid3=fork(); 
    if(pid3 == 0){ 
     printf("PID of child 3 is :%d\n",getpid()); 
     //sleep(2); 
    } 
    else{ 
     printf("PID of parent is :%d\n",getpid()); 
     waitpid(pid1,0,0); 
     waitpid(pid2,0,0); 
     waitpid(pid3,0,0); 
    } 
} 

Фактический выход:

PID of child 1 is :4963 

PID of parent is :4962 

PID of parent is :4963 

PID of child 2 is :4966 

PID of parent is :4966 

PID of child 2 is :4964 

PID of parent is :4964 

PID of child 3 is :4967 

PID of child 3 is :4965 

PID of child 3 is :4969 

PID of child 3 is :4968 

Ожидаемый результат:

  1. PID родителя, потому что ПИД1 не 0 и никогда не будет 0 здесь ,

  2. Затем ждет, пока ПИД1 т.е. child1 не получает прекращается и печатает PID ребенка 1

  3. Тогда прямо сейчас child2 и child3 еще не раздвоенный, поэтому они пропускаются

  4. Затем снова PID родителя, PID ребенка1, pid ребенка2

  5. Тогда PID родителя, pid child1, pid child2 и pid child3.

Итак, где я пойду неправильно, пожалуйста?

ответ

1

Здесь мы идем ...

pid1=fork() 

На данный момент два процесса идут. Родитель [PID 4962] и ребенок, который только что был порожден [PID 4963]. Родитель ПИД1 = 4963 [PID ребенка], и ребенок [child1] имеет ПИД1 = 0. Таким образом, ребенок будет распечатать:

"PID of child 1 is: 4963" 

И оба процесса идут на их веселый путь, пока они не добираются до :

pid2=fork() 

Здесь родитель [PID 4962] и child1 [PID 4963] и икру дочерний процесс. Мы будем называть ребенка, что исходный родитель порождает child2 [возможно, PID 4964] и ребенок, который порождает child1, мы будем называть child1_1 [возможно, PID 4966]. Теперь, первоначальный родитель ПИД2 = 4964 [возможно] и Child2 имеет ПИД2 = 0. Child1 имеет ПИД2 = 4966 [возможно] и child1_1 имеет ПИД2 = 0. Таким образом, как и child2 child1_1 напечатает что-то:

"PID of child 2 is: 4966" 
"PID of child 2 is: 4964" 

Теперь все эти процессы получают это:

pid3=fork() 

Ouch.

Исходный родитель, child1, child2 и child1_1 все порождают дочерний процесс. Что вы, , в конечном итоге с чем-то вроде этого:

Для исходного родителя, child1, child2 и child1_1, pid3!= 0 Для их четыре дочерних процессов, PID3 == 0

Таким образом, те четыре ребенка обрабатывает все сообщает о своем ИДПЕ, как это:

"PID of child 3 is: xxxx" 

Но оригинальный родитель [4962], child1 [4963], child2 [возможно, 4964], и child1_1 [возможно 4966] печати:

"PID of parent is: xxxx" 

, а затем ждать их дочерние процессы с PIDS PID1, PID2 и PID3 вернуться.

Имейте в виду, что все эти процессы работают одновременно, и это объясняет, почему вы не всегда можете предсказать порядок выполнения заявлений печати .

+0

Здравствуйте, я очень ценю ваше терпение! Все в порядке, за исключением того, что меня оставили еще одно сомнение, вот оно и, пожалуйста, не против. Когда встречается pid2, у него есть два родителя, поэтому он печатает «pid of parent is» 2 раза, но когда встречается pid3, почему он не печатает «pid of parent is» в 4 раза, хотя у него 4 родителя? – jeevan

+1

Я думаю, что путаница находится в сфере вашего предложения else. Если вы дважды проверите фигурные скобки в своем коде, вы увидите, что предложение else связано только с «if (pid3 == 0)». Итак, на самом деле, четыре конечных родителя печатают свои собственные PID ... но только после того, как они терпят неудачу «if (pid3 == 0)». – seanoftime

+0

Спасибо! полностью пропустил это в полном замешательстве! :) – jeevan

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