Я пытаюсь создать дерево процессов с помощью fork (), чтобы число дочерних элементов на одного родителя было в заданном массиве, например, если массив равен {2,1,3,0,0,0,0}, дерево будет выглядеть так:
| a |
/ \
| b | | c |
/ / | \
| d | | e | | f | | g |
Я могу создавать процессы и отделять родительский процесс от дочернего процесса, проверяя, равно ли значение, возвращаемое функцией fork (), 0.
И мне удалось создать дерево процессов, но дерево, которое мне удается создать, симметрично, а не то, что я действительно хочу построить.
Не могу разобраться с частью процессов маршрутизации между братьями и сестрами,
Как я могу проверить для каждого процесса отдельно, сколько дочерних элементов должно создать для него, и создать для него, не создавая для других процессов родственного процесса?
Это то, что я получил до сих пор:
int main() {
int nums[7] = { 2,1,3,0,0,0,0 };
int pid, pid2;
size_t len = sizeof(nums)/sizeof(int);
int childs2;
printf("\nProcess number %d has pid= %d\n", 0, getpid());
int childs = 1;
while( childs <= nums[0] ) {
pid = fork();
if (pid == 0 ) {
printf("Process number %d has pid= %d\n", childs, getpid());
printf("I am Process with pid=%d and my parent pid=%d\n", getpid(), getppid());
waitpid(getppid());
for (int i=1; i<len; i++) {
childs2 = 0;
if (childs2 < nums[i]) {
pid2 = fork();
if (pid2 == 0) {
printf("Process number %d has pid= %d\n", childs, getpid());
printf("I am Process with pid=%d and my parent pid=%d\n", getpid(), getppid());
waitpid(getppid());
break;
} else {
wait(NULL);
childs2++;
}
} else {
childs2++;
}
}
break;
} else {
wait(NULL);
childs++;
}
}
return 0;
}
Мне нужно различать процессы, чтобы знать, какой процесс является листом, а какой - родительским. Для этого мне нужно выполнить разные действия в каждом процессе, и я не могу придумать, как это сделать,
мой вывод:
Process number 0 has pid= 98431
Process number 1 has pid= 98432
I am Process with pid=98432 and my parent pid=98431
Process number 1 has pid= 98433
I am Process with pid=98433 and my parent pid=98432
Process number 1 has pid= 98434
I am Process with pid=98434 and my parent pid=98432
Process number 2 has pid= 98435
I am Process with pid=98435 and my parent pid=98431
Process number 2 has pid= 98436
I am Process with pid=98436 and my parent pid=98435
Process number 2 has pid= 98437
I am Process with pid=98437 and my parent pid=98435
и дерево выглядит так:
| a |
/ \
| b | | c |
/ \ / \
| d | | e || f | | g |
но я хочу, чтобы результат был:
Process number 0 has pid= 98431
Process number 1 has pid= 98432
I am Process with pid=98432 and my parent pid=98431
Process number 2 has pid= 98433
I am Process with pid=98433 and my parent pid=98431
Process number 3 has pid= 98434
I am Process with pid=98434 and my parent pid=98432
Process number 4 has pid= 98435
I am Process with pid=98435 and my parent pid=98433
Process number 5 has pid= 98436
I am Process with pid=98436 and my parent pid=98433
Process number 6 has pid= 98437
I am Process with pid=98437 and my parent pid=98433
так дерево будет выглядеть так:
| a |
/ \
| b | | c |
/ / | \
| d | | e | | f | | g |
.