Нужно реализовать эту эту иерархию процессов
Каждый процесс, имеющий детей, не должен завершаться раньше, чем его дети. В
термины сообщений, отображаемых функцией «info ()», сообщение END
parent никогда не должен появляться перед сообщениями END своих детей. Функция информации выглядит следующим образом info(BEGIN | END, process_no, thread_no);
int main() {
init();
pid_t pid2, pid3, pid4,pid5,pid6,pid7,pid8,pid9;
info(BEGIN,1,0);
pid2 = fork();
if ( pid2 == 0 ) {
// P2 child
info(BEGIN,2,0);
pid5 = fork();
if ( pid5 == 0 ) { // P5 child
info(BEGIN,5,0);
pid9 = fork();
if(pid9 == 0){ // P9 child
info(BEGIN,9,0);
info(END,9,0);
}
waitpid(pid9,'\0','\0');
info(END,5,0);
// grandchild (of top-level parent)
} else {
waitpid(pid5,'\0','\0');
info(END,2,0);
}
} else if((pid3 = fork()) == 0) {
info(BEGIN,3,0); // P3 child
pid4 = fork();
if(pid4 == 0){ //P4 child
info(BEGIN,4,0);
info(END,4,0);
}else{
pid6 = fork();
if(pid6 == 0){ //P6 child
info(BEGIN,6,0);
pid7 = fork();
if(pid7 == 0){ //P7 child
info(BEGIN,7,0);
info(END,7,0);
}
waitpid(pid7,'\0','\0');
info(END,6,0);
}
}
waitpid(pid4,'\0','\0');
waitpid(pid6,'\0','\0');
info(END,3,0);
}
else{
pid8=fork();
if(pid8 == 0){ //P9 child
info(BEGIN,8,0);
info(END,8,0);
}
waitpid(pid2,'\0','\0');
waitpid(pid3,'\0','\0');
waitpid(pid4,'\0','\0');
waitpid(pid5,'\0','\0');
waitpid(pid6,'\0','\0');
waitpid(pid7,'\0','\0');
waitpid(pid8,'\0','\0');
waitpid(pid9,'\0','\0');
info(END, 1, 0);
}
for(int i=0; i<8; i++){
wait(NULL);
}
return 0;
}
Мой вывод
[ ] BEGIN P1 T0 pid=4370 ppid=4122 tid=1184286464
[ ] BEGIN P2 T0 pid=4371 ppid=4370 tid=1184286464
[ ] BEGIN P8 T0 pid=4373 ppid=4370 tid=1184286464
[ ] BEGIN P3 T0 pid=4372 ppid=4370 tid=1184286464
[ ] END P8 T0 pid=4373 ppid=4370 tid=1184286464
[ ] BEGIN P5 T0 pid=4374 ppid=4371 tid=1184286464
[ ] END P1 T0 pid=4373 ppid=4370 tid=1184286464
[ ] BEGIN P4 T0 pid=4375 ppid=4372 tid=1184286464
[ ] BEGIN P6 T0 pid=4376 ppid=4372 tid=1184286464
[ ] END P4 T0 pid=4375 ppid=4372 tid=1184286464
[ ] BEGIN P9 T0 pid=4377 ppid=4374 tid=1184286464
[ ] END P3 T0 pid=4375 ppid=4372 tid=1184286464
[ ] END P9 T0 pid=4377 ppid=4374 tid=1184286464
[ ] BEGIN P7 T0 pid=4378 ppid=4376 tid=1184286464
[ ] END P5 T0 pid=4377 ppid=4374 tid=1184286464
[ ] END P7 T0 pid=4378 ppid=4376 tid=1184286464
[ ] END P6 T0 pid=4378 ppid=4376 tid=1184286464
[ ] END P5 T0 pid=4374 ppid=4371 tid=1184286464
[ ] END P3 T0 pid=4378 ppid=4376 tid=1184286464
[ ] END P2 T0 pid=4371 ppid=4370 tid=1184286464
[ ] END P6 T0 pid=4376 ppid=4372 tid=1184286464
[ ] END P3 T0 pid=4376 ppid=4372 tid=1184286464
[ ] END P3 T0 pid=4372 ppid=4370 tid=1184286464
[ ] END P1 T0 pid=4370 ppid=4122 tid=1184286464
Ожидаемый результат:
[ ] BEGIN P1 T0 pid=4370 ppid=4122 tid=1184286464
[ ] BEGIN P2 T0 pid=4371 ppid=4370 tid=1184286464
[ ] BEGIN P3 T0 pid=4372 ppid=4370 tid=1184286464
[ ] BEGIN P8 T0 pid=4373 ppid=4370 tid=1184286464
[ ] END P8 T0 pid=4373 ppid=4370 tid=1184286464
[ ] BEGIN P4 T0 pid=4375 ppid=4372 tid=1184286464
[ ] BEGIN P5 T0 pid=4374 ppid=4371 tid=1184286464
[ ] BEGIN P6 T0 pid=4376 ppid=4372 tid=1184286464
[ ] END P4 T0 pid=4375 ppid=4372 tid=1184286464
[ ] BEGIN P9 T0 pid=4377 ppid=4374 tid=1184286464
[ ] END P9 T0 pid=4377 ppid=4374 tid=1184286464
[ ] BEGIN P7 T0 pid=4378 ppid=4376 tid=1184286464
[ ] END P5 T0 pid=4377 ppid=4374 tid=1184286464
[ ] END P7 T0 pid=4378 ppid=4376 tid=1184286464
[ ] END P6 T0 pid=4378 ppid=4376 tid=1184286464
[ ] END P3 T0 pid=4378 ppid=4376 tid=1184286464
[ ] END P2 T0 pid=4371 ppid=4370 tid=1184286464
[ ] END P1 T0 pid=4370 ppid=4122 tid=1184286464
Я пытаюсь разобраться в этом почти 2 часа, но не могу понять, что не так хорошо, я думаю, что это как-то связано с waitpid, но не могу понять ...