NAZWA¶
atexit - rejestracja funkcji wywoływanej po normalnym zakończeniu
procesu
SKŁADNIA¶
#include <stdlib.h>
int atexit(void (*funkcja)(void));
OPIS¶
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-2001 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.
WARTOŚĆ ZWRACANA¶
Funkcja
atexit() zwraca wartość 0, jeśli
zakończy się pomyślnie. W przeciwnym wypadku zwraca
wartość niezerową.
ZGODNE Z¶
SVr4, 4.3BSD, C89, C99, POSIX.1-2001.
UWAGI¶
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-2001 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.
POSIX.1-2001 określa, że wynik jest niezdefiniowany, jeśli
longjmp(3) jest używane do zakończenia wykonywania
funkcji zarejestrowanej przez
atexit().
Uwagi linuksowe¶
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.
PRZYKŁAD¶
#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);
}
ZOBACZ TAKŻE¶
_exit(2),
exit(3),
on_exit(3)
O STRONIE¶
Angielska wersja tej strony pochodzi z wydania 3.71 projektu Linux
man-pages. Opis projektu, informacje dotyczące zgłaszania
błędów, oraz najnowszą wersję
oryginału można znaleźć pod adresem
http://www.kernel.org/doc/man-pages/.
TŁUMACZENIE¶
Autorami polskiego tłumaczenia niniejszej strony podręcznika man
są: Adam Byrtek (PTM) <abyrtek@priv.onet.pl>, Andrzej
Krzysztofowicz (PTM) <ankry@mif.pg.gda.pl> i Robert Luberda
<robert@debian.org>.
Polskie tłumaczenie jest częścią projektu
manpages-pl; uwagi, pomoc, zgłaszanie błędów na
stronie
http://sourceforge.net/projects/manpages-pl/. Jest zgodne z
wersją
3.71 oryginału.