atexit -
プロセスが正常終了した時に呼び出される関数を登録する
#include <stdlib.h>
int atexit(void (*function)(void));
atexit()
関数は、与えられた
function を、
exit(3)
やプログラムの
main()
関数からの返りを通じて、プロセスが正常終了した時に呼び出される
関数として登録する。
ここで定義された関数は、登録した順番とは逆の順番で呼び出される。
登録した関数に引数は渡されない。
同じ関数を複数回登録してもよい。
登録された関数は登録
1 回につき 1
回呼び出される。
POSIX.1
では、このような関数を少なくとも
ATEXIT_MAX 個 (32個)
登録できることを要求している。
その実装でサポートされている実際の上限は
sysconf(3)
を使って取得できる。
fork(2)
で作成された場合、子プロセスは親プロセスの登録のコピーを継承する。
exec(3)
ファミリーの関数の場合、呼び出しに成功すると、
全ての登録が削除される。
atexit()
関数は、関数登録が成功した時には
0 を返す。
その他の場合には 0
以外の値を返す。
この節で使用されている用語の説明については、
attributes(7) を参照。
インターフェース |
属性 |
値 |
atexit() |
Thread safety |
MT-Safe |
POSIX.1-2001, POSIX.1-2008, C89, C99, SVr4, 4.3BSD.
atexit() (と
on_exit(3))
を使って登録された関数は、
シグナルの配送によりプロセスが異常終了した場合には呼び出されない。
登録された関数の一つが
_exit(2)
を呼び出した場合、残りの関数はどれも起動されず、
exit(3)
により実行される他のプロセス終了ステップは実行されない。
POSIX.1 では、
atexit()
を使って登録された一つの関数内で、複数回
exit(3)
を呼び出した際の結果は未定義である。
(Linux ではないが)
いくつかのシステムでは、この場合、
繰り返しが無限に起こることになる。
移植性が必要なプログラムでは、
atexit()
で登録された関数内で
exit(3)
を起動すべきではない。
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("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),
dlopen(3),
exit(3),
on_exit(3)
この man ページは Linux
man-pages
プロジェクトのリリース
5.10
の一部である。プロジェクトの説明とバグ報告に関する情報は
https://www.kernel.org/doc/man-pages/
に書かれている。