Может кто-нибудь объяснить, почему вывод такой? Я очень смущен тем, как эти процессы выполняются (в каком порядке?), А также около 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
Ожидаемый результат:
PID родителя, потому что ПИД1 не 0 и никогда не будет 0 здесь ,
Затем ждет, пока ПИД1 т.е. child1 не получает прекращается и печатает PID ребенка 1
Тогда прямо сейчас child2 и child3 еще не раздвоенный, поэтому они пропускаются
Затем снова PID родителя, PID ребенка1, pid ребенка2
Тогда PID родителя, pid child1, pid child2 и pid child3.
Итак, где я пойду неправильно, пожалуйста?
Здравствуйте, я очень ценю ваше терпение! Все в порядке, за исключением того, что меня оставили еще одно сомнение, вот оно и, пожалуйста, не против. Когда встречается pid2, у него есть два родителя, поэтому он печатает «pid of parent is» 2 раза, но когда встречается pid3, почему он не печатает «pid of parent is» в 4 раза, хотя у него 4 родителя? – jeevan
Я думаю, что путаница находится в сфере вашего предложения else. Если вы дважды проверите фигурные скобки в своем коде, вы увидите, что предложение else связано только с «if (pid3 == 0)». Итак, на самом деле, четыре конечных родителя печатают свои собственные PID ... но только после того, как они терпят неудачу «if (pid3 == 0)». – seanoftime
Спасибо! полностью пропустил это в полном замешательстве! :) – jeevan