Завершення виконання процесу
Процес завершує роботу при виконанні системного виклику exit.
Процес може сам завершити свою роботу, відповідно до алгоритму, або може бути припинений ядром.
При завершенні процесу послідовно виконуються наступні дії:
вимикаються усі сигнали.
У викликала процесі закриваються всі дескриптори відкритих файлів.
Якщо батьківський процес знаходиться в стані виклику wait, то системний виклик wait завершується, видаючи батьківському процесові як результат ідентифікатор завершився процесу, і молодші 8 біт його коду завершення.
Якщо батьківський процес не знаходиться в стані виклику wait, то завершується процес переходить у стан зомбі.
У всіх існуючих нащадків завершених процесів, а також у зомбі-процесів ідентифікатор батьківського процесу встановлюється рівним 1. Таким чином, вони стають нащадками процесу ініціалізації (init).
Якщо ідентифікатор процесу, термінальна лінія і ідентифікатор групи процесів у завершується процесу збігаються, то всім процесам з тим же ідентифікатором групи процесів посилається сигнал SIGHUP. Тим самим, завершуються і всі породжені в пріоритетному режимі процеси.
Батьківському процесові посилається сигнал SIGCHLD (завершення породженого процесу). Цей сигнал пробуджує батьківський процес, якщо той чекає завершення породжених процесів.
6. Системні виклики wait, waitpid
Системні виклики wait, waitpid і waitid очікують, поки дочірній процес не змінить свій стан (призупинення, поновлення або завершення) і повертають його викликає програмі ..
waitpid - очікує зміни стану дочірнього процесу
# include <sys/wait.h>
pid_t waitpid (pid_t pid, int * statusp, int options)
pid-ідентифікатор процесу або групи процесів
statusp - покажчик на статус або NULL
options - прапори;
У разі успіху повертає ідентифікатор процесу або 0, у разі помилки -1 (код помилки у змінній errno)
Аргумент pid може приймати такі
− значення:>0 Очікувати зміна стану дочірнього процесу з вказаним ідентифікатором.
− -1 Очікувати зміна стану будь-якого дочірнього процесу.
− 0 Очікувати зміна стану будь-якого дочірнього процесу, що належить до тієї ж групи процесів, що і викликає.
− <-1 Очікувати зміна стану будь-якого дочірнього процесу, що належить до групи процесів з ідентифікатором-pid.
На виході з waitpid викликає процес отримує ідентифікатор процесу-нащадка у вигляді значення, що повертається, чий ідентифікатор збігся з аргументом pid. Нуль повертається тільки в тому випадку, коли був встановлений прапор WNOHANG (буде описано нижче).
Допускається очікувати зміни стану тільки прямих нащадків, породжених системним викликом fork. Очікування процесів-«онуків» не допускається, навіть якщо їхні батьки (прямі нащадки викликає процесу) до моменту виклику вже завершили свою роботу. «Осиротілі» процеси передаються під опікунство спеціального системного процесу, а не їх «бабусь-дідусів».
Як правило, процеси-предки зацікавлені в отриманні інформації про стан своїх нащадків - в іншому випадку процеси-нащадки по завершенні перетворюються на «зомбі» і перебувають в такому вигляді, поки не завершить роботу батьківський процес. Тоді системний процес, який став «прийомним батьком», зможе звернутися до виклику wait і видалити «зомбований» процес. Якщо очікування нащадків неможливо, з тих чи інших причин, процес може використовувати сигнали для запобігання «зомбування».
Системний виклик waitpid може повернути стан змінив його дочірнього процесу тільки один раз (такий дочірній процес називається очікуваний). Або іншими тільки один раз словами: очікуваний нащадок перестає бути очікуваним, якщо звіт про зміну його стану вже отримано. Це означає наступне: якщо в одній точці програми було отримано стан нащадка і раптом виявилося, що це не той нащадок, якого очікували, то немає ніякого способу повернути
Аргумент options може містити один або більше прапорів, об'єднаних опера цією АБО:
WEXITED Повідомляти про завершення нащадка (завжди мається на увазі в waitpid, який нс має такого прапора).
WSTOPPED Повідомляти про припинення нащадка (подібно waitpid з прапором WUNTRACED).
WCONTINUED Повідомляти про відновлення роботи нащадком (аналогічний прапор передбачений і в waitpid).
WNOHANG Не очікувати зміни стану нащадка. Якщо воно ще не змінилося - повертати значення 0 (аналогічний прапор передбачений і в waitpid).
WNOWAiT Залишити нащадка очікуваним. Таким чином, відстежити зміну стану нащадка можна буде декількома викликами waitpid.