atexit(3)

НАИМЕНОВАНИЕ
atexit - регистрирует функцию, вызываемую при обычном завершении программы

БИБЛИОТЕКА
Standard C library (libc, -lc)

ОБЗОР
#include <stdlib.h>

int atexit(typeof(void (void)) *function);

ОПИСАНИЕ
Функция atexit() регистрирует передаваемую функцию function в качестве функции, вызываемой при нормальном завершении работы программы, например, с помощью exit(3), или при завершении работы функции main. Зарегистрированные функции вызываются в порядке, обратном регистрации; никаких аргументов им не передаётся.

Одна функция может быть зарегистрирована несколько раз: она вызывается один раз для каждой регистрации.

В POSIX.1 требуется, чтобы реализация позволяла регистрировать не менее ATEXIT_MAX (32) таких функций. Установленный лимит, поддерживаемый реализацией, можно определить с помощью sysconf(3).

Когда дочерний процесс создаётся через fork(2), он наследует копии регистраций родителя. При успешном выполнении одной из функций exec(3) все регистрации снимаются.

ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ
Функция atexit() при успешном выполнении возвращает 0, в противном случае — ненулевое значение.

АТРИБУТЫ
Описание терминов данного раздела смотрите в attributes(7).
Интерфейс | Атрибут | Значение
atexit() | Безвредность в нитях | MT-Safe

ВЕРСИИ
В POSIX.1 указано, что при многократном вызове exit(3) (т. е., вызов exit(3) из функций, зарегистрированных atexit()) состояние программы не определено. В некоторых системах (не в Linux), это приводит к бесконечной рекурсии; переносимые программы не должны вызывать exit(3) из функций, зарегистрированных через atexit().

СТАНДАРТЫ
C11, POSIX.1-2008.

ИСТОРИЯ
POSIX.1-2001, C89, C99, SVr4, 4.3BSD.

ПРИМЕЧАНИЯ
Функции, зарегистрированные с помощью atexit() (и on_exit(3)) не вызываются, если процесс завершился некорректно, например из-за полученного сигнала.

Если одна из зарегистрированных функций вызывает _exit(2), то оставшиеся функции не вызываются, и другие шаги по завершению процесса, производимые exit(3), не выполняются.

Функции atexit() и on_exit(3) регистрируют функции в едином списке: при нормальном завершении процесса зарегистрированные функции вызываются в порядке обратном регистрации с помощью данных функций.

Согласно POSIX.1 результат является не определённым, если при завершении выполнения одной из функций, зарегистрированной с помощью atexit(), используется longjmp(3).

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

ПРИМЕРЫ
    #include <stdio.h>
    #include <stdlib.h>
    #include <unistd.h>

    void
    bye(void)
    {
        printf("That was all, folks\n");
    }

    int
    main(void)
    {
        long a;
        int i;

        a = sysconf(_SC_ATEXIT_MAX);
        printf("ATEXIT_MAX = %ld\n", a);

        i = atexit(bye);
        if (i != 0) {
            fprintf(stderr, "cannot set exit function\n");
            exit(EXIT_FAILURE);
        }

        exit(EXIT_SUCCESS);
    }

СМОТРИТЕ ТАКЖЕ
_exit(2), dlopen(3), exit(3), on_exit(3)

ПЕРЕВОД
Русский перевод этой страницы руководства разработал(и) Dmitry Bolkhovskikh <d20052005@yandex.ru>, Yuri Kozlov <yuray@komyakino.ru> и Kirill Rekhov <krekhov.dev@gmail.com>

Этот перевод является свободной программной документацией; он распространяется на условиях общедоступной лицензии GNU (GNU General Public License - GPL, https://www.gnu.org/licenses/gpl-3.0.html версии 3 или более поздней) в отношении авторского права, но БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ.

Если вы обнаружите какие-либо ошибки в переводе этой страницы руководства, пожалуйста, сообщите об этом разработчику(ам) по его(их) адресу(ам) электронной почты или по адресу списка рассылки русских переводчиков (<debian-l10n-russian@lists.debian.org>).