exit - вызывает
нормальное
завершение
процесса
Standard C library (
libc,
-lc)
#include <stdlib.h>
[[noreturn]] void exit(int status);
The
exit() function causes normal process termination and the least
significant byte of
status (i.e.,
status & 0xFF) is returned
to the parent (see
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, 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() код
выхода
должен
быть
передан
родительскому
процессу.
Есть три
варианта:
- •
- Если
родитель
установил
обработчик
SA_NOCLDWAIT или SIGCHLD
равным SIG_IGN,
то код
выхода
отбрасывается
и потомок
завершается
сразу.
- •
- Если
родитель
ожидает
завершения
потомка, то
он
получает
код выхода
и потомок
сразу
завершается.
- •
- Иначе
потомок
становится
процессом
«зомби»:
большинство
ресурсов
процесс
задействуется
вторично,
но слот с
минимумом
информации
о
процессе-потомке
(код
завершения,
статистика
по
использованию
ресурсов)
остаётся в
таблице
процессов.
Это
позволяет
родителю в
дальнейшем
использовать
waitpid(2) (или
подобный)
для
получения
кода
завершения
потомка;
после
этого слот
под
процесс-зомби
освобождается.
Если в
реализации
поддерживается
сигнал
SIGCHLD,
то он
посылается
родителю.
Если
родитель
установил
флаг
SA_NOCLDWAIT, то
поведение
при
сигнале
SIGCHLD
не
определено.
Если
существующий
процесс
является
лидером
сеанса и
управляющим
терминала
сеанса, то
каждому
процессу
из группы
фонового
режима
этого
управляющего
терминала
посылается
сигнал
SIGHUP, и
терминал
отключается
от сеанса,
чтобы его
можно было
захватить
новому
управляющему
процессу.
Если
завершение
процесса
приводит к
осиротению
группы
процессов,
и если
любой член
только что
осиротевшей
группы
останавливается,
то каждому
процессу
этой
группы
после
сигнала
SIGHUP
будет
послан
сигнал
SIGCONT.
Описание
процесса
осиротения
группы
смотрите в
setpgid(2).
За
исключением
описанные
выше
случаев,
когда
процессы,
куда
посылается
сигнал,
могут быть
потомками
завершающегося
процесса,
завершение
процесса,
обычно,
не
приводит к
отправке
сигнала
потомкам
этого
процесса.
Однако,
процесс
может
вызвать
prctl(2)
с
операцией
PR_SET_PDEATHSIG, чтобы
подготовиться
к
получению
сигнала,
если его
родитель
завершает
работу.
_exit(2),
get_robust_list(2),
setpgid(2),
wait(2),
atexit(3),
on_exit(3),
tmpfile(3)
Русский
перевод
этой
страницы
руководства
был сделан
Azamat Hackimov <
[email protected]>, Yuri Kozlov
<
[email protected]> и Иван
Павлов <
[email protected]>
Этот
перевод
является
бесплатной
документацией;
прочитайте
Стандартную
общественную
лицензию GNU
версии 3
или более
позднюю,
чтобы
узнать об
условиях
авторского
права. Мы не
несем
НИКАКОЙ
ОТВЕТСТВЕННОСТИ.
Если вы
обнаружите
ошибки в
переводе
этой
страницы
руководства,
пожалуйста,
отправьте
электронное
письмо на
[email protected]