exit(3) вызывает нормальное завершение процесса

ОБЗОР

#include <stdlib.h>


void exit(int status);

ОПИСАНИЕ

Функция exit() выполняет нормальное завершение процесса и возвращает значение status & 0377 породившему процессу (смотрите wait(2)).

Вызываются все функции, зарегистрированные с помощью atexit(3) и on_exit(3), в обратном по отношению к регистрации порядке (в этих функциях возможно использовать atexit(3) или on_exit(3) для регистрации дополнительной функции, которая будет также вызвана при выходе; при этом она добавляется в начало списка функций, которые осталось вызвать). Если из одной из функций не происходит возврат (например, она вызывает _exit(2) или завершает себя по сигналу), то оставшиеся функции не вызываются, и дальнейший процесс выхода прекращается (в частности, запись потоков stdio(3)). Если функция зарегистрирована с помощью atexit(3) или on_exit(3) несколько раз, то она вызывается столько раз, сколько зарегистрирована.

Все открытые потоки stdio(3) записываются и закрываются. Файлы, созданные tmpfile(3), удаляются.

В стандарте Си определены две константы, EXIT_SUCCESS и EXIT_FAILURE, которые можно передавать exit() для указания корректности или некорректности завершения, соответственно.

ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ

Функция exit() не возвращает выполнение.

АТРИБУТЫ

Описание терминов данного раздела смотрите в attributes(7).
ИнтерфейсАтрибутЗначение
exit() безвредность в нитяхнебезопасно (MT-Unsafe race:exit)

Функция exit() использует глобальную незащищённую переменную, поэтому функцию нельзя использовать в нескольких нитях одновременно.

СООТВЕТСТВИЕ СТАНДАРТАМ

POSIX.1-2001, POSIX.1-2008, C89, C99, SVr4, 4.3BSD.

ЗАМЕЧАНИЯ

Нигде не определено, что должно случиться, если одна из функций, зарегистрированных с помощью atexit(3) и on_exit(3), вызовет exit() или longjmp(3). Заметим, что вызов execve(2) удаляет регистрацию функций, сделанную с помощью atexit(3) и on_exit(3).

Использование EXIT_SUCCESS и EXIT_FAILURE является более переносимым методом (в не-UNIX окружения), чем указание 0 и какого-то ненулевого значения (например, 1 или -1). В частности, в VMS используется другое соглашение.

В BSD пытались стандартизовать коды завершения; смотрите файл <sysexits.h>.

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

Если в реализации поддерживается сигнал SIGCHLD, то он посылается родителю. Если родитель установил флаг SA_NOCLDWAIT, то поведение при сигнале SIGCHLD не определено.

Если процесс является лидером сеанса и управляющим терминала сеанса, то каждому процессу из группы фонового режима этого управляющего терминала посылается сигнал SIGHUP, и терминал отключается от сеанса, чтобы его можно было захватить новому управляющему процессу.

Если завершение процесса приводит к осиротению группы процессов, и если любой член только что осиротевшей группы останавливается, то каждому процессу этой группы после сигнала SIGHUP будет послан сигнал SIGCONT. Описание процесса осиротения группы смотрите в setpgid(2).