#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);
}
[man1]
[man2]
[man3]
[man4]
[man5]
[man6]
[man7]
[man8]
[a]
[b]
[c]
[d]
[e]
[f]
[g]
[h]
[i]
[j]
[k]
[l]
[m]
[n]
[o]
[p]
[q]
[r]
[s]
[t]
[u]
[v]
[w]
[x]
[y]
[z]