exit - вызывает нормальное завершение процесса
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).