#include <stdlib.h> int atexit(void (*function)(void));
同じ関数を複数回登録してもよい。 登録された関数は登録 1 回につき 1 回呼び出される。
POSIX.1 では、このような関数を少なくとも ATEXIT_MAX 個 (32個) 登録できることを要求している。 その実装でサポートされている実際の上限は sysconf(3) を使って取得できる。
fork(2) で作成された場合、子プロセスは親プロセスの登録のコピーを継承する。 exec(3) ファミリーの関数の場合、呼び出しに成功すると、 全ての登録が削除される。
インターフェース | 属性 | 値 |
atexit() | Thread safety | MT-Safe |
登録された関数の一つが _exit(2) を呼び出した場合、残りの関数はどれも起動されず、 exit(3) により実行される他のプロセス終了ステップは実行されない。
POSIX.1 では、 atexit() を使って登録された一つの関数内で、複数回 exit(3) を呼び出した際の結果は未定義である。 (Linux ではないが) いくつかのシステムでは、この場合、 繰り返しが無限に起こることになる。 移植性が必要なプログラムでは、 atexit() で登録された関数内で exit(3) を起動すべきではない。
atexit() と on_exit(3) は、同じリストに対して関数を登録する。 プロセスが正常に終了した際には、 これらの二つの関数で登録された順序の逆順で、 登録された関数が起動される。
POSIX.1 では、 atexit() で登録された関数の実行を終了するために longjmp(3) が使用された場合の結果は未定義である。
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);
}