Во-первых, используйте заключенный в скобки блок для else
, связанный с "if (pid4==0)
", и обязательно вложите блок "if (pid5==0)
" внутрь.Это дает вам лучшую внутреннюю согласованность, но, что более важно, позволяет избежать тестирования значения pid5
в процессе, который никогда не устанавливает его:
else {
pid5=fork();
if (pid5==0){
printf("I'm the child P5.PID=%d, PPID=%d.\n", getpid(), getppid());
}
}
Затем, если вы добавите блок else
к этому внутреннемувложенный if
, он будет введен только процессом 2. В таком блоке вы можете вставить два вызова в wait()
для сбора двух дочерних элементов.
Обратите внимание также, что сразу после wait()
if (pid!=0){
представляется неуместным.Он вызывается p0 в то время, когда p1 является единственным потомком, которого он разветвил.Поэтому p0 будет ждать p1 , в то время как ваше заявленное намерение - дождаться p2 , который еще не былраздвоенный в этот момент.Вы вообще не требовали ждать p1 .Ожидание p2
может идти в блоке else
, связанном с if (pid2==0)
.
Однако следует также отметить, что, поскольку он хочет ожидать конкретно p2 , p0 должен избегать одурачивания в вероятном случае, если сначала он соберет p1 .Вы можете сделать это правильно, проверив возвращаемое значение wait()
(которое при успехе является pid собранного ребенка), или вы можете использовать waitpid()
вместо этого, чтобы специально ждать процесса p2 и нетдругой.