table of contents
ATEXIT(3) | Руководство программиста Linux | ATEXIT(3) |
ИМЯ¶
atexit - регистрирует функцию, вызываемую при обычном завершении программы
ОБЗОР¶
#include <stdlib.h> int atexit(void (*function)(void));
ОПИСАНИЕ¶
Функция atexit() регистрирует передаваемую функцию function в качестве функции, вызываемой при нормальном завершении работы программы, например, с помощью exit(3), или при завершении работы функции main. Зарегистрированные функции вызываются в порядке, обратном регистрации; никаких аргументов им не передаётся.
Одна и та же функция может быть зарегистрирована несколько раз: она вызывается один раз для каждой регистрации.
В POSIX.1-2001 требуется, чтобы реализация позволяла регистрировать не менее ATEXIT_MAX (32) таких функций. Установленный лимит, поддерживаемый реализацией, можно определить с помощью sysconf(3).
Когда дочерний процесс создается через fork(2), он наследует копии родительских регистраций. При успешном вызове к одной из функций exec(3), все регистрации снимаются.
ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ¶
Функция atexit() при успешном выполнении возвращает 0, в противном случае — ненулевое значение.
СООТВЕТСТВИЕ СТАНДАРТАМ¶
SVr4, 4.3BSD, C89, C99, POSIX.1-2001.
ЗАМЕЧАНИЯ¶
Функции, зарегистрированные с помощью atexit() (и on_exit(3)) не вызываются, если процесс завершился некорректно, например из-за полученного сигнала.
Если одна из зарегистрированных функций вызывает _exit(2), то все оставшиеся функции не вызываются и оставшиеся шаги завершения процесса, выполняемые exit(3), не выполняется.
В POSIX.1-2001 указано, что при многократном вызове exit(3) (т. е., вызов exit(3) из функций, зарегистрированных atexit()) состояние программы не определено. В некоторых системах (не в Linux), это приводит к бесконечной рекурсии; переносимые программы не должны вызывать exit(3) из функций, зарегистрированных через atexit().
Функции atexit() и on_exit(3) регистрируют функции в едином списке: при нормальном завершении процесса зарегистрированные функции вызываются в порядке обратном регистрации с помощью данных функций.
В POSIX.1-2001 указано, что результат не определён, если для завершения функции, зарегистрированной 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); }
СМОТРИТЕ ТАКЖЕ¶
2008-12-05 | Linux |