atexitのヘルプ・マニュアル
日本語 英語
atexit --help
man atexit
ATEXIT(3) Linux Programmer’s Manual ATEXIT(3)
名前
atexit - プロセスが正常終了した時に呼び出される関数を登録する
書式
#include
int atexit(void (*function)(void));
説明
atexit() 関数は、与えられた function を、 exit(3) やプログラムの main()
関数からの返りを通じて、プロセスが正常終了した時に呼び出される関数と し
て 登録する。ここで定義された関数は、登録した順番とは逆の順番で呼び出さ
れる。登録した関数に引き数は渡されない。
同じ関数を複数回登録してもよい。登録された関数は登録 1 回につき 1 回 呼
び出される。
POSIX.1-2001 では、このような関数を少なくとも ATEXIT_MAX 個 (32個) 登録
できることを要求している。その実装でサポートされている実 際 の 上 限 は
sysconf(3) を使って取得できる。
fork(2) で作成された場合、子プロセスは親プロセスの登録のコピーを継承す
る。 exec(3) ファミリーの関数のいずれかの呼び出しに成功すると、全ての登
録が削除される。
返り値
atexit() 関数は、関数登録が成功した時には 0 を返す。その他の場合には 0
以外の値を返す。
準拠
SVr4, 4.3BSD, C89, C99, POSIX.1-2001.
注意
atexit() (と on_exit(3)) を使って登録された関数は、シグナルの配送により
プロセスが異常終了した場合には呼び出されない。
登 録された関数の一つが _exit(2) を呼び出した場合、残りの関数はどれも起
動されず、 exit(3) により実行される他のプロセス終了ステップは実行されな
い。
POSIX.1-2001 では、 atexit(3) を使って登録された一つの関数内で、複数回
exit(3) を呼び出した際の結果は未定義である。 (Linux ではないが) いく つ
か のシステムでは、この場合、繰り返しが無限に起こることになる。移植性が
必要なプログラムでは、 atexit(3) で登録された関数内で exit(3) を起動 す
べきではない。
atexit() と on_exit(3) は、同じリストに対して関数を登録する。プロセスが
正常に終了した際には、これらの二つの関数で登録された順序の逆順で、登 録
された関数が起動される。
POSIX.1-2001 で は、 atexit(3) で登録された関数の実行を終了するために
longjmp(3) が使用された場合の結果は未定義である。
Linux での注意
glibc 2.2.3 以降では、共有ライブラリがアンロードされるときに呼ばれる 関
数 を登録するために、共有ライブラリの中で atexit() (と on_exit(3)) を使
用することができる。
例
#include
#include
#include
void
bye(void)
{
printf("That was all, folks\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, "cannot set exit function\n");
exit(EXIT_FAILURE);
}
exit(EXIT_SUCCESS);
}
関連項目
_exit(2), exit(3), on_exit(3)
Linux 2008-12-05 ATEXIT(3)
ATEXIT(3) Linux Programmer’s Manual ATEXIT(3)
NAME
atexit - register a function to be called at normal process termination
SYNOPSIS
#include
int atexit(void (*function)(void));
DESCRIPTION
The atexit() function registers the given function to be called at nor-
mal process termination, either via exit(3) or via return from the pro-
gram’s main(). Functions so registered are called in the reverse order
of their registration; no arguments are passed.
The same function may be registered multiple times: it is called once
for each registration.
POSIX.1-2001 requires that an implementation allow at least ATEXIT_MAX
(32) such functions to be registered. The actual limit supported by an
implementation can be obtained using sysconf(3).
When a child process is created via fork(2), it inherits copies of its
parent’s registrations. Upon a successful call to one of the exec(3)
functions, all registrations are removed.
RETURN VALUE
The atexit() function returns the value 0 if successful; otherwise it
returns a non-zero value.
CONFORMING TO
SVr4, 4.3BSD, C89, C99, POSIX.1-2001.
NOTES
Functions registered using atexit() (and on_exit(3)) are not called if
a process terminates abnormally because of the delivery of a signal.
If one of the functions registered functions calls _exit(2), then any
remaining functions are not invoked, and the other process termination
steps performed by exit(3) are not performed.
POSIX.1-2001 says that the result of calling exit(3) more than once
(i.e., calling exit(3) within a function registered using atexit(3)) is
undefined. On some systems (but not Linux), this can result in an
infinite recursion; portable programs should not invoke exit(3) inside
a function registered using atexit(3).
The atexit() and on_exit(3) functions register functions on the same
list: at normal process termination, the registered functions are
invoked in reverse order of their registration by these two functions.
POSIX.1-2001 says that the result is undefined if longjmp(3) is used to
terminate execution of one of the functions registered atexit().
Linux Notes
Since glibc 2.2.3, atexit() (and on_exit(3)) can be used within a
shared library to establish functions that are called when the shared
library is unloaded.
EXAMPLE
#include
#include
#include
void
bye(void)
{
printf("That was all, folks\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, "cannot set exit function\n");
exit(EXIT_FAILURE);
}
exit(EXIT_SUCCESS);
}
SEE ALSO
_exit(2), exit(3), on_exit(3)
COLOPHON
This page is part of release 3.22 of the Linux man-pages project. A
description of the project, and information about reporting bugs, can
be found at http://www.kernel.org/doc/man-pages/.
Linux 2008-12-05 ATEXIT(3)