Будут ли ожидания () выполняться в предсказуемом порядке? - PullRequest
0 голосов
/ 14 февраля 2019

Предположим, у меня был следующий код:

pid_t pid0, pid1;

pid0 = fork();
if (!pid0) {
    pid1 = fork();

    if (!pid1) { // p2
        /* do something */
        return; 
    } else {    // p1
        wait(NULL);
        printf("p1 done\n");
        return;
   }
} 

// p0
wait(NULL):
printf("p0 done\n");

Является ли порядок операторов print детерминированным или он будет зависеть от воли ЦП?На практике это кажется одинаковым каждый раз, но документы для wait() делают его случайным.

РЕДАКТИРОВАТЬ: я думал об этом еще немного, и мне интересно, всегда ли он в таком порядке, потому что p0 не имеет p2 как дочерний процесс;это ребенок p1.Таким образом, «p0 done» не будет печататься до тех пор, пока p1 не завершит ожидание своего потомка p2.Итак, я полагаю, что реальный вопрос заключается в том, ждет ли wait() детей детей или просто перерабатывает одно "поколение"

1 Ответ

0 голосов
/ 14 февраля 2019

Процесс 0 всегда будет ждать процесса 1, потому что это единственный дочерний элемент, который у него есть.И процесс 1 всегда будет ждать процесса 2, потому что это единственный дочерний элемент, который у него есть.

Процесс 0 не вернется из wait до завершения процесса 1, что означает, что процесс 1 уже напечатал свое сообщение,потому что он делает это до своего выхода.

Так что в этом случае процесс 0 не может продолжаться до тех пор, пока сообщение не будет напечатано.

...