Что если ребенок выйдет до того, как родитель вызовет wait ()? - PullRequest
2 голосов
/ 06 мая 2019

Я изучаю метод wait () на C. И я знаю, что он блокирует родительский процесс, пока один из его дочерних процессов не завершится.Но что, если ядро ​​решит спланировать дочерний процесс первым, и дочерний процесс завершится, прежде чем родительский объект сможет вызвать wait ()?Это родитель будет ждать там вечно (без других прерываний), так как он не может наблюдать за возвращением ребенка?

На фото, если последовательность выполнения: fork -> HC -> exit -> HP -> wait, то ситуация, которую я опишу, произойдет.enter image description here

Ответы [ 2 ]

4 голосов
/ 06 мая 2019

Нет, родитель не будет ждать вечно.

Документация по wait гласит:

Все эти системные вызовы используются для ожидания изменений состояния в ребенок процесса вызова, и получить информацию о ребенке чье состояние изменилось. Изменением состояния считается: ребенок прекращен ; ребенок был остановлен сигналом; или ребенок был возобновлено по сигналу. В случае прерванного ребенка, выполнение ожидание позволяет системе высвободить ресурсы, связанные с ребенок; если ожидание не выполняется, то прерванный дочерний элемент остается в состоянии "зомби" .

Если ребенок уже изменил состояние, эти вызовы немедленно возвращаются.

2 голосов
/ 06 мая 2019

Но что, если ядро ​​решит спланировать ребенка первым и дочерний процесс завершается до того, как родитель может вызвать wait()?

Это довольно вероятный случай. Если одна из функций семейства wait используется родителем или signal(SIGCHLD, SIG_IGN); вызывается явно перед fork ing, это не превращает дочернего элемента в зомби, даже если родительский процесс выгружен (= не разрешено использовать CPU в то время).

Кроме того, упомянутая необходимость ожидания или незнания сигнала предназначена для очистки неиспользованных данных процесса. При использовании одного из методов ядру говорят, что дочерний (ren) процесс больше не используется. Таким образом, вы можете очистить неиспользуемые системные ресурсы.

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