#include <stdlib.h> int atexit(void (*function)(void));
同じ関数を複数回登録してもよい。 登録された関数は登録 1 回につき 1 回呼び出される。
POSIX.1-2001 では、このような関数を少なくとも ATEXIT_MAX 個 (32個) 登録できることを要求している。 その実装でサポートされている実際の上限は sysconf(3) を使って取得できる。
fork(2) で作成された場合、子プロセスは親プロセスの登録のコピーを継承する。 exec(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) が使用された場合の結果は未定義である。
#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); }