atexit(3) | Library Functions Manual | atexit(3) |
atexit - регистрирует функцию, вызываемую при обычном завершении программы
Standard C library (libc, -lc)
#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, 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).
Начиная с 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); }
_exit(2), dlopen(3), exit(3), on_exit(3)
Русский перевод этой страницы руководства был сделан Dmitry Bolkhovskikh <d20052005@yandex.ru> и Yuri Kozlov <yuray@komyakino.ru>
Этот перевод является бесплатной документацией; прочитайте Стандартную общественную лицензию GNU версии 3 или более позднюю, чтобы узнать об условиях авторского права. Мы не несем НИКАКОЙ ОТВЕТСТВЕННОСТИ.
Если вы обнаружите ошибки в переводе этой страницы руководства, пожалуйста, отправьте электронное письмо на man-pages-ru-talks@lists.sourceforge.net.
5 февраля 2023 г. | Linux man-pages 6.03 |