Назва

exit — викликати нормальне завершення програми

Використання

#include <stdlib.h>
void exit(int status );

Опис

Функція exit() викликає нормальне завершення роботи програми й повертає величину (status & 0377) батьківському процесові (див. ?wait(2)). Всі зареєстровані з допомогою atexit() і on_exit() функції викликаються в порядку, протилежному до порядку їх реєстрації, а всі відкриті потоки зливаються й закриваються. Файли, створені за допомогою tmpfile(), вилучаються.

Стандарт C вказує два означення, EXIT_SUCESS і EXIT_FAILURE, що можуть передаватись функції exit() на позначення, відповідно, успішного або ж неуспішного завершення.

Повернене значення

Функція exit() не повертається.

Примітки

Під час обробки виходу можна зареєструвати додаткові функції за допомогою atexit() і on_exit(). У всіх випадках остання зареєстрована функція вилучається з ланцюжка зареєстрованих функцій і викликається. Що повинно статись, якщо під час цієї обробки буде викликано exit() або longjmp(), не визначено.

Використання EXIT_SUCCESS і EXIT_FAILURE переноситься (на не-Unix-середовища) дещо краще, ніж 0 і якась ненульова величина (як-от 1 або -1). Зокрема, VMS має щодо цього інше погодження.

BSD намагалась стандартизувати коди завершення — див. файл <sysexits.h>

Після виконання exit() стан виходу повинен передатись батьківському процесові. Тут можливі три випадки. Якщо процес-предок встановив SA_NOCLDWAIT, або ж встановив обробник сигналу SIGCHLD в значення SIG_IGN, стан нехтується. Якщо предок чекав на завершення нащадка, його повідомляється про стан виходу. В обох випадках процес негайно помирає. Якщо предок не вказав, що його не цікавить стан виходу нащадка, але й не чекає його завершення, процес, що виходить, перетворюється на «зомбі» (нічим іншим, як сховищем одного байту, котрий вказуватиме стан виходу), так що предок зможе дінатись про цей стан пізніше, викликавши одну з функцій wait().

Якщо реалізація підтримує сигнал SIGCHLD, цей сигнал посилається предкові. Якщо предок встановив SA_NOCLDWAIT, не визначено, чи сигнал SIGCHLD буде послано.

Якщо процес є провідним у сеансі й підлеглий йому термінал контролює сеанс, то кожному процесові з групи переднього плану цього терміналу посилається сигнал SIGHUP, а термінал від'єднується від цього сеансу, дозволяючи взяти контроль над собою іншому процесові.

Якщо вихід з процесу спричиняє «осиротіння» групи процесів і котрийсь із процесів цієї групи зупиняється, кожному процесові цієї групи буде надіслано спершу сигнал SIGHUP, за яким одразу ж — SIGCONT.

Дивіться також

? exit(2), ?wait(2), atexit(3), ?on exit(3), tmpfile(3)

Переклад

Цю сторінку переклав Ярослав Федевич.