Linux
2019-03-06
man-pages-ru
Russian man pages from the Linux Documentation Project
manpages-dev
Manual pages about using GNU/Linux for development
man-pages
Linux kernel and C library user-space interface documentation
ИМЯ
exit - вызывает нормальное завершение процесса
ОБЗОР
#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 пытались стандартизовать коды завершения (которые также были взяты и другие библиотеки Си, например GNU C); смотрите файл <sysexits.h>.
После exit() код выхода должен быть передан родительскому процессу. Есть три варианта:
o | Если родитель установил обработчик SA_NOCLDWAIT или SIGCHLD равным SIG_IGN, то код выхода отбрасывается и потомок завершается сразу. |
o | Если родитель ожидает завершения потомка, то он получает код выхода и потомок сразу завершается. |
o | Иначе потомок становится процессом «зомби»: большинство ресурсов процесс задействуется вторично, но слот с минимумом информации о процессе-потомке (код завершения, статистика по использованию ресурсов) остаётся в таблице процессов. Это позволяет родителю в дальнейшем использовать waitpid(2) (или подобный) для получения кода завершения потомка; после этого слот под процесс-зомби освобождается. |
Сигналы, посылаемые другим процессам
Если существующий процесс является лидером сеанса и управляющим терминала сеанса, то каждому процессу из группы фонового режима этого управляющего терминала посылается сигнал SIGHUP, и терминал отключается от сеанса, чтобы его можно было захватить новому управляющему процессу.
Если завершение процесса приводит к осиротению группы процессов, и если любой член только что осиротевшей группы останавливается, то каждому процессу этой группы после сигнала SIGHUP будет послан сигнал SIGCONT. Описание процесса осиротения группы смотрите в setpgid(2).
За исключением описанные выше случаев, когда процессы, куда посылается сигнал, могут быть потомками завершающегося процесса, завершение процесса, обычно, не приводит к отправке сигнала потомкам этого процесса. Однако, процесс может вызвать prctl(2) с операцией PR_SET_PDEATHSIG, чтобы подготовиться к получению сигнала, если его родитель завершает работу.
СМОТРИТЕ ТАКЖЕ
REFERENCED BY
man(1), _exit(2), kill(2), vfork(2), wait(2), abort(3), assert(3), assert_perror(3), atexit(3), err(3), error(3), on_exit(3), pthread_create(3), pthread_detach(3), pthread_exit(3), setjmp(3), stdin(3), stdio(3), tmpfile(3), firestring_malloc(3), firestring_realloc(3), firestring_strdup(3), iv_fd(3), iv_thread(3), abort(3), rmtdebug(3), rmtfilename(3), rmtgetconn(3), rmthostname(3), rmtinit(3), rmtrmt(3), rmtrsh(3), man-db(1), man.man-db(1)