atexit - регистрирует функцию, вызываемую при обычном завершении программы
atexit(3)
регистрирует функцию, вызываемую при обычном завершении программы
ОБЗОР
#include <stdlib.h>
int atexit(void (*function)(void));
ОПИСАНИЕ
Функция
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-2001, POSIX.1-2008, C89, C99, SVr4, 4.3BSD.
ЗАМЕЧАНИЯ
Функции, зарегистрированные с помощью
atexit() (и
on_exit(3)) не
вызываются, если процесс завершился некорректно, например из-за полученного
сигнала.
Если одна из зарегистрированных функций вызывает _exit(2), то все
оставшиеся функции не вызываются и оставшиеся шаги завершения процесса,
выполняемые exit(3), не выполняется.
В POSIX.1 указано, что при многократном вызове exit(3) (т. е., вызов
exit(3) из функций, зарегистрированных atexit()) состояние программы
не определено. В некоторых системах (не в Linux), это приводит к бесконечной
рекурсии; переносимые программы не должны вызывать exit(3) из функций,
зарегистрированных через atexit().
Функции 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("Но вот и всё\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, "не удалось установить функцию при выходе\n");
exit(EXIT_FAILURE);
}
exit(EXIT_SUCCESS);
}