Как раскошелиться только с указанным c дочерним элементом? - PullRequest
0 голосов
/ 23 марта 2020

Я пытаюсь построить дерево процессов следующим образом:

               P1
            /      \
          P3        P2
                      \
                       P4
                        \
                         ....

Но я не мог заставить его работать. Я пробовал это, но это только вилки с P1.

for(int i = 0; i < depth; i++) {
    int _pid = fork();
    if(_pid == 0) {
        printf("[son] pid %d from [parent] pid %d\n", getpid(), getppid());
        exit(0);
    }
}
wait(NULL);

1 Ответ

0 голосов
/ 23 марта 2020

Требование использовать только один вызов 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 возвращал действительные значения!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...