atexit - rejestracja funkcji wywoływanej po normalnym zakończeniu
procesu
Standardowa biblioteka C (
libc,
-lc)
#include <stdlib.h>
int atexit(void (*funkcja)(void));
Funkcja
atexit() powoduje, że podana
funkcja będzie
wywołana po normalnym zakończeniu pracy procesu, które
może nastąpić przez
exit(3) lub przez
powrót z funkcji
main() procesu. Funkcje zarejestrowane w ten
sposób są wywoływane w kolejności odwrotnej do ich
rejestracji; nie są im przekazywane żadne argumenty.
Tę samą funkcję można zarejestrować kilka
razy: zostanie wywołana tyle razy, ile razy została
zarejestrowana.
POSIX.1 wymaga, aby implementacja pozwalała na zarejestrowanie co
najmniej
ATEXIT_MAX (32) takich funkcji. Bieżące
ograniczenie obsługiwane przez implementację można
odczytać za pomocą funkcji
sysconf(3).
Kiedy proces potomny jest tworzony za pomocą
fork(2), dziedziczy
kopie zarejestrowań funkcji rodzica. Po pomyślnym
wywołaniu jednej z funkcji
exec(3), wszystkie zarejestrowane
funkcje są usuwane.
Funkcja
atexit() zwraca wartość 0, jeśli
zakończy się pomyślnie. W przeciwnym wypadku zwraca
wartość niezerową.
Informacje o pojęciach używanych w tym rozdziale można
znaleźć w podręczniku
attributes(7).
Interfejs |
Atrybut |
Wartość |
atexit() |
Bezpieczeństwo wątkowe |
MT-Safe |
POSIX.1-2001, POSIX.1-2008, C99, SVr4, 4.3BSD.
Funkcje zarejestrowane przez
atexit() (i
on_exit(3)) nie są
uruchamiane w przypadku nienormalnego zakończenia procesu po otrzymaniu
sygnału.
Jeśli jedna z zarejestrowanych funkcji wywoła
_exit(2), to
pozostałe zarejestrowane funkcje nie będą uruchamiane i
żadne inne kroki kończenia procesu nie będą
podejmowane przez
exit(3).
POSIX.1 określa, że wynik wywołania
exit(3)
więcej niż raz (np. wywołanie
exit(3) przez
funkcję zarejestrowaną przez
atexit()) jest
niezdefiniowany. Na niektórych systemach (ale nie pod Linuksem)
może to spowodować nieskończoną rekurencję.
Programy przenośne nie powinny wywoływać
exit(3) z
ciała funkcji rejestrowanej przez
atexit().
Funkcje
atexit() i
on_exit(3) rejestrują funkcje,
używając tej samej listy: podczas normalnego zakończenia
procesu, zarejestrowane funkcje są uruchamiane w kolejności
odwrotnej do kolejności ich rejestracji przez
którąkolwiek z dwu powyższych funkcji.
Zgodnie z POSIX.1 wynik jest niezdefiniowany, jeśli
longjmp(3)
jest używane do zakończenia wykonywania funkcji zarejestrowanej
za pomocą
atexit().
Od wersji 2.2.3 biblioteki glibc funkcji
atexit() (oraz
on_exit(3)) można użyć w obrębie biblioteki
współdzielonej do zarejestrowania funkcji wywoływanych
podczas wyładowywania biblioteki współdzielonej.
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
void
bye(void)
{
printf("I to by było wszystko\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, "nie można ustawić funkcji wyjścia\n");
exit(EXIT_FAILURE);
}
exit(EXIT_SUCCESS);
}
_exit(2),
dlopen(3),
exit(3),
on_exit(3)
Autorami polskiego tłumaczenia niniejszej strony podręcznika
są: Adam Byrtek <
[email protected]>, Andrzej Krzysztofowicz
<
[email protected]>, Robert Luberda <
[email protected]> i
Michał Kułach <
[email protected]>
Niniejsze tłumaczenie jest wolną dokumentacją.
Bliższe informacje o warunkach licencji można uzyskać
zapoznając się z
GNU
General Public License w wersji 3 lub nowszej. Nie przyjmuje się
ŻADNEJ ODPOWIEDZIALNOŚCI.
Błędy w tłumaczeniu strony podręcznika prosimy
zgłaszać na adres listy dyskusyjnej
[email protected]