Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Lek_4,5_.doc
Скачиваний:
0
Добавлен:
01.04.2025
Размер:
412.16 Кб
Скачать

4. Завершення процесу

Коли процес завершується, його блок БУП руйнується, а адресний прос­тір, який він займав і ресурси звільняються. Код завершення розміщується в головну таблицю процесів. Як тільки батьківський процес прийме цей код, від­повідна структура таблиці процесів буде видалена. Процес завершується, якщо дотримані наступні вимоги.

  • Всі інструкції виконані.

  • Процес очевидним чином передає керування батьківському процесу або викликає системну функцію, яка завершує процес.

  • Дочірні процеси можуть завершуватися автоматично при завершенні батьківського процесу.

  • Батьківський процес подає сигнал про завершення свої дочірніх про­це­сів.

Аварійне завершення процесу може відбутися в тому випадку, якщо процес виконує неприпустимі дії.

  • Процес потребує більше пам’яті, ніж система може йому надати.

  • Процес намагається отримати доступ до недозволених ресурсів.

  • Процес намагається виконати некоректну інструкцію або заборонені обчислення.

Завершення процесу може бути ініційоване користувачем, якщо цей процес інтерактивний.

Батьківський процес несе відповідальність за завершення (звільнення) своїх нащадків. Батьківський процес повинен очікувати до тих пір, доки не за­вершаться всі його дочірні процеси. Якщо батьківський процес виконає зчиту­вання коду завершення дочірнього процесу, процес-нащадок покидає систему нормально. Процес залишається в зомбованому стані до тих пір, доки його предок не прийме відповідний сигнал. Якщо батько ніколи не приймає сигнал (оскільки він вже встиг сам завершитися і вийти з системи або не очікував за­вершення дочірнього процесу), процес-нащадок залишається в зомбованому стані до тих пір, доки процес init (вихідний системний процес) не прийме його код завершення. Велика кількість зомбованих процесів може негативно впли­нути на продуктивність системи.

4.1. Функції exit (), kill () і abort ()

Для самостійного завершення процес може викликати одну із двох фун­кцій: exit () і abort (). Функція exit () забезпечує нормальне завершення процесу , який викликає. При цьому будуть закриті всі дескриптори відкритих файлів, по­в’язаних з процесом. Функція exit () скине на диск всі відкриті потоки, які міс­тять ще не переписані буферизовані дані, після чого відкриті потоки будуть закриті. Параметр status приймає статус завершення процесу, який повертається батьківському процесу, що очікує, який в подальшому перезапускається. Пара­метр status може приймати наступні значення: 0, EXIT_FAILURE або EXIT _SUCCESS. Значення 0 говорить про вдале завершення процесу. Батьківський процес, що очікує, має доступ лише до молодших восьми бітів значення пара­ме­­тру status. Якщо батьківський процес не очікує завершення дочірнього про­цесу, його (що став зомбі) всиновлює процес init.

Функція abort () реалізує аварійне закінчення процесу, який викликає, що за наслідками рівноцінне результату виконання функції fclose () для всіх відкритих потоків. При цьому батьківський процес, що очікує, отримає сигнал про завершення виконання дочірнього процесу. Процес може звернутися до передчасного закінчення тільки у випадку, якщо він виявить помилку з якою не зможе впоратися програмним шляхом.

Синопсис

# include < stdlib.h >

void exit (int status);

void abort (void);

Функцію kill () можемо використати для примусового завершення іншо­го процесу. Дана функція відправляє повідомлення процесам, які задаються параметром pid. Параметр sig – це сигнал, призначений для відправки заданому процесу. Можливі сигнали перераховано в заголовку < signal.h >. Для знищення процесу параметр sig повинен мати значення SIGKILL. Щоб мати право відпра­вити сигнал процесу, процес, що викликає, повинен володіти відповідними при­вілеями, або його реальний або ідентифікатор ефективного користувача пови­нен співпадати з реальним або збереженим ідентифікатором процесу, який при­ймає даний сигнал. Процес що викликає, може мати дозвіл на відправку проце­сам тільки визначених (не довільних) сигналів. При успішній відправці сигналу функція повертає процесу, що викликає, значення 0, в протилежному випадку – число -1.

Процес, який викликає, може відправити сигнал одному або декільком процесам при наступних умовах:

pid > 0

Сигнал буде надіслано процесу, ідентифікатор (PID) якого рівний значенню параметра pid.

pid = 0

Сигнал буде надіслано всім процесам, у яких ідентифікатор групи процесів співпадає з ідентифікатором процесу, який викликає.

pid = -1

Сигнал буде надіслано всім процесам, для яких процес, що викликає, має дозвіл відправляти цей сигнал.

pid < -1

Сигнал буде надіслано всім процесам, у яких ідентифікатор групи процесів рівний абсолютному значенню параметра pid, і для яких процес, що викликає має дозвіл відправляти цей сигнал.

Синопсис

# include < signal.h >

int kill (pid_t pid, int sig);

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]