21 Language support library [language.support]

21.5 Start and termination [support.start.term]

[ Note: Заголовок <cstdlib> объявляет функции, описанные в этом подпункте. ]end note

[[noreturn]] void _Exit(int status) noexcept;

Effects: Эта функция имеет семантику, указанную в стандартной библиотеке C.

Remarks: Программа завершается без выполнения деструкторов для объектов с автоматической, поточной или статической продолжительностью хранения и без вызова функций, переданных в atexit() ([basic.start.term]). Функция _­Exit безопасна для сигналов ([csignal.syn]).

[[noreturn]] void abort() noexcept;

Effects: Эта функция имеет семантику, указанную в стандартной библиотеке C.

Remarks: Программа завершается без выполнения деструкторов для объектов с автоматической, поточной или статической продолжительностью хранения и без вызова функций, переданных в atexit() ([basic.start.term]). Функция abort безопасна для сигналов ([csignal.syn]).

int atexit(c-atexit-handler* f) noexcept; int atexit(atexit-handler* f) noexcept;

Effects: В atexit() функции регистрации функции , на которую указывает f называть без аргументов при нормальном завершении программы. Не определено , является ли вызов atexit() делает это не happen before вызов exit() преуспеет. [ Note: Эти atexit() функции не вводить гонки данных ([res.on.data.races]). ] end note

Implementation limits: Реализация должна поддерживать регистрацию не менее 32 функций.

Returns: В atexit() Функции возвращает ноль , если регистрация прошла успешно, отлично от нуля , если он выходит из строя.

[[noreturn]] void exit(int status);

Effects:

  • Сначала уничтожаются объекты с длительностью хранения потока, связанные с текущим потоком. Затем объекты со статической продолжительностью хранения уничтожаются и вызываются функции, зарегистрированные при вызове atexit .215 Смотрите [basic.start.term] порядок разрушений и вызовов. (Автоматические объекты не уничтожаются в результате вызова exit().)216

    Если элемент управления оставляет зарегистрированную функцию, вызванную, exit потому что функция не предоставляет обработчик для возникшего исключения, std​::​terminate() должна быть вызвана ([except.terminate]).

  • Затем все открытые потоки C (опосредованные сигнатурами функций, объявленными в <cstdio>) с незаписанными буферизованными данными сбрасываются, все открытые потоки C закрываются, а все файлы, созданные в результате вызова tmpfile() , удаляются.

  • Наконец, управление возвращается в среду хоста. Если status равно нулю или EXIT_­SUCCESS, возвращается форма статуса, successful terminationопределяемая реализацией. Если status есть EXIT_­FAILURE, возвращается форма статуса, unsuccessful terminationопределяемая реализацией. В противном случае возвращаемый статус определяется реализацией.217

int at_quick_exit(c-atexit-handler* f) noexcept; int at_quick_exit(atexit-handler* f) noexcept;

Effects: В at_­quick_­exit() функции регистрации функции , на которую указывает f называться без аргументов при quick_­exit вызове. Не определено , является ли вызов at_­quick_­exit() делает , что не happen before все вызовы quick_­exit будут преуспевать. [ Note: Эти at_­quick_­exit() функции не вводить гонки данных ([res.on.data.races]). ] [ Порядок регистрации может быть неопределенным, если он был вызван из более чем одного потока. ] [ В регистрации отличается от регистраций и приложениям могут понадобиться вызвать как регистрационные функции с теми же аргументами. ] end noteNote: at_­quick_­exit end noteNote: at_­quick_­exit atexit end note

Implementation limits: Реализация должна поддерживать регистрацию не менее 32 функций.

Returns: Ноль в случае успешной регистрации и ненулевое значение в случае неудачи.

[[noreturn]] void quick_exit(int status) noexcept;

Effects: Функции, зарегистрированные с помощью вызовов at_­quick_­exit , вызываются в порядке, обратном их регистрации, за исключением того, что функция должна вызываться после любых ранее зарегистрированных функций, которые уже были вызваны во время регистрации. Объекты не должны быть уничтожены в результате вызова quick_­exit. Если элемент управления оставляет зарегистрированную функцию, вызванную, quick_­exit потому что функция не предоставляет обработчик для возникшего исключения, std​::​terminate() должна быть вызвана. [ Note: Функция, зарегистрированная через at_­quick_­exit , вызывается вызывающим потоком quick_­exit, который может быть другим потоком, чем тот, который ее зарегистрировал, поэтому зарегистрированные функции не должны полагаться на идентичность объектов с длительностью хранения потока. ] После вызова зарегистрированных функций вызовет . [ Стандартные файловые буферы не сбрасываются. ]end note quick_­exit _­Exit(status)Note: end note

Remarks: Функция quick_­exit безопасна для сигналов ([csignal.syn]), если функции, зарегистрированные с помощью at_­quick_­exit .

Смотрите также: [basic.start], [basic.start.term], ISO C 7.22.4.

Функция вызывается каждый раз, когда она регистрируется.

Все объекты с автоматической продолжительностью хранения уничтожаются в программе, которая не main function содержит автоматических объектов и выполняет вызов exit(). Управление может быть передано напрямую такой main функции, вызвав исключение, которое было перехвачено main.

Макросы EXIT_­FAILURE и EXIT_­SUCCESS определены в <cstdlib>.