У комп'ютерних операційних системах процес (або завдання) може чекати на завершення виконання іншого процесу. У більшості систем батьківський процес може створити незалежно виконуваний дочірній процес. Після цього батьківський процес може виконати системний виклик wait, який призупиняє виконання батьківського процесу, доки виконується дочірній. Коли дочірній процес завершується, він повертає статус завершення операційній системі, яка потім повертає його процесу-батьку, що очікує. Після цього батьківський процес відновлює виконання.
Сучасні операційні системи також надають системні виклики, які дозволяють потоку процесу створювати інші потоки та чекати на їхнє завершення («приєднувати» їх) подібним чином.
Операційна система може надавати варіанти виклику wait, які дозволяють процесу чекати на завершення будь-якого з його дочірніх процесів або чекати на завершення одного конкретного дочірнього процесу (ідентифікованого його ідентифікатором процесу).
Деякі операційні системи надсилають сигнал SIGCHLD батьківському процесу, коли дочірній процес завершується, повідомляючи про це батьківський процес і дозволяючи йому отримати статус завершення дочірнього процесу.
Статус завершення дочірнього процесу зазвичай вказує, чи завершився процес нормально чи аварійно. У разі нормального завершення цей статус також містить код завершення (зазвичай ціле число), який процес повернув системі. Протягом перших 20 років існування UNIX батьківському процесу, що очікував, були доступні лише молодші 8 бітів коду завершення. У 1989 році в SVR4 було запроваджено новий виклик waitid, який повертає всі біти з виклику exit у структурі, названій siginfo_t, у члені структури si_status. Waitid є обов'язковою частиною стандарту POSIX з 2001 року.
Зомбі та сироти
Коли дочірній процес завершується, він стає процесом-зомбі і продовжує існувати як запис у системній таблиці процесів, хоча вже не є програмою, що активно виконується. За нормальної роботи його батьківський процес зазвичай негайно очікує на нього, після чого система вилучає його, звільняючи ресурс (запис у таблиці процесів). Якщо батьківський процес не очікує на дочірній, той продовжує необмежено споживати цей ресурс і, таким чином, є витік ресурсів.
І навпаки, дочірній процес, батьківський процес якого завершується раніше за нього, стає процесом-сиротою. Такі ситуації зазвичай обробляються спеціальним «кореневим» (або «init») процесом, який призначається новим батьківським процесом процесу, коли його батьківський процес завершується. Цей спеціальний процес виявляє завершення процесу-сироти, а потім отримує його статус завершення, дозволяючи системі звільнити ресурси завершеного дочірнього процесу.
Якщо дочірній процес отримує сигнал, батьківський процес, що очікує, після цього продовжує виконання, залишаючи по собі процес-сироту. Отже, іноді необхідно перевірити аргумент, установлений функціями wait, waitpid або waitid, і в разі, якщо WIFSIGNALED має значення true, знову чекати на дочірній процес для звільнення ресурсів.
Див. також exit (системний виклик) fork (системний виклик) Spawn (інформатика) wait
Примітки