Требование использовать только один вызов fork
делает решение громоздким и уродливым, но все же выполнимым, как это:
Шаг 1: создайте внутренний l oop, который будет выполняться дважды, если i
0 и один раз для любого i > 0
.
Шаг 2: разветвление только в дочернем процессе после первой итерации внешнего l oop.
Шаг 3: выход из дочернего процесса это было разветвлено на второй итерации внутренней l oop.
int cur_pid = 0;
printf("Root PID %d started by %d\n", getpid(), getppid());
for (int i = 0; i < depth && cur_pid == 0; i++) {
for (int j = 0; j < (i ? 1 : 2); j++) {
cur_pid = fork();
if (cur_pid == 0) {
printf("[son] pid %d from [parent] pid %d\n", getpid(), getppid());
if (j == 1) {
exit(0);
} else {
break;
}
} else if (cur_pid < 0) {
printf("Error forking at PID %d\n", getpid());
}
}
}
wait(NULL);
Не забудьте wait
на дочернем процессе каждой итерации, если вы хотите, чтобы getppid
возвращал действительные значения!