Мне нужно создать дерево процессов, как на этом изображении:
Мне удалось создать такое дерево, но с небольшой разницей. P4 - это фактически P3, а P3 - это P4. Я создал их по порядку, потому что не могу придумать, как «прикрепить» P4 к P1 и P3 к P2.
Это то, что я написал до сих пор:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
#include "a2_helper.h"
int main(int argc, char **argv){
printf("Main pid is %d\n", getpid());
pid_t pid1[2];
pid_t pid2[4];
pid_t pid3a, pid3b;
//FIRST LAYER
for(int i = 0; i < 2; i++){
pid1[i] = fork();
if(pid1[i] == 0){
printf("[son] pid %d from [parent] pid %d\n", getpid(), getppid());
//SECOND LAYER
if ( i == 0){
for(int j = 0; j < 4; j++){
pid2[j] = fork();
if (pid2[j] == 0){
printf("\t[son] pid %d from [parent] pid %d\n", getpid(), getppid());
//THIRD LAYER
if (j == 1){
pid3a = fork();
if (pid3a == 0){
printf("\t\t[son] pid %d from [parent] pid %d\n", getpid(), getppid());
exit(0);
}
waitpid(pid3a, NULL, 0);
}
if (j == 2){
pid3b = fork();
if (pid3b == 0){
printf("\t\t[son] pid %d from [parent] pid %d\n", getpid(), getppid());
exit(0);
}
waitpid(pid3b, NULL, 0);
}
//END THIRD LAYER
exit(0);
}
}
//END SECOND LAYER
for(int j = 0; j < 4; j++)
waitpid(pid2[j], NULL, 0);
}
exit(0);
}
}
for(int i = 0; i < 2; i++)
waitpid(pid1[i], NULL, 0);
//END FIRST LAYER
return 0;
}
Что я могу изменить, чтобы добиться этого?