У багатьох комп'ютерних операційних системах процес завершує своє виконання за допомогою системного виклику . У ширшому значенні, у середовищі багатопотоковості вихід означає, що потік припинив роботу. Для керування ресурсами операційна система звільняє ресурси (пам'ять, и тощо), які використовував процес. Після завершення процес називається мертвим процесом.
Як це працює
В Unix та Unix-подібних операційних системах процес запускається, коли його батьківський процес виконує системний виклик fork. Після цього батьківський процес може очікувати на завершення дочірнього процесу або продовжити виконання (можливо, створюючи інші дочірні процеси). Коли дочірній процес завершується («помирає») — або нормально, викликавши exit, або аварійно через фатальну помилку] чи сигнал (наприклад, SIGTERM, SIGINT, SIGKILL) — операційній системі повертається статус завершення, а батьківському процесу надсилається сигнал SIGCHLD. Статус завершення потім може бути отриманий батьківським процесом за допомогою системного виклику wait.
Більшість операційних систем дозволяють процесу, що завершується, передати системі певний статус завершення, який стає доступним батьківському процесу. Зазвичай це ціле число, хоча деякі операційні системи (наприклад, Plan 9 від Bell Labs) дозволяють повертати рядок символів. Системи, що повертають ціле значення, зазвичай використовують нульове значення для позначення успішного виконання, а ненульові значення — для позначення станів помилки. Інші системи (наприклад, OpenVMS) використовують парні значення для успішного завершення та непарні значення для помилок. Ще інші системи (наприклад, IBM z/OS та її попередники) використовують діапазони цілих значень для позначення результатів успішного завершення, завершення з попередженням і завершення з помилкою.
Очищення
Операція виходу зазвичай виконує операції очищення в адресному просторі процесу перед передаванням керування назад операційній системі. Деякі системи та мови програмування дозволяють реєструвати користувацькі підпрограми, щоб вони викликалися під час завершення програми, перш ніж процес фактично припинить своє існування. Як останній етап завершення викликається примітивний системний виклик виходу, який повідомляє операційну систему про завершення процесу та дозволяє їй звільнити ресурси, використані процесом.
Іноді звичайне очищення можна обійти; C99 надає функцію _exit(), яка завершує поточний процес без додаткового очищення програми. Це може використовуватися, наприклад, у процедурі fork-exec, коли виклик exec не може замінити дочірній процес; виклик підпрограм atexit помилково звільнив би ресурси, що належать батьківському процесу.
Сироти та зомбі
Деякі операційні системи особливим чином обробляють дочірній процес, батьківський процес якого завершився. Такий процес-сирота стає дочірнім процесом спеціального кореневого процесу, який потім очікує на завершення дочірнього процесу. Подібна стратегія використовується для роботи з процесом-зомбі — дочірнім процесом, який завершився, але його батьківський процес ігнорує його статус завершення. Такий процес стає дочірнім процесом спеціального батьківського процесу, який отримує статус завершення дочірнього процесу та дозволяє операційній системі завершити процес завершеного процесу. Обробка цих особливих випадків підтримує таблицю процесів системи в узгодженому стані.
Посилання C++ reference for std::exit