Provided by: manpages-ja-dev_0.5.0.0.20221215+dfsg-1_all
名前
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) が使用された場 合の結果は未定義である。 Linux での注意 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/ に書かれている。