Provided by: manpages-ja-dev_0.5.0.0.20221215+dfsg-1_all bug

名前

       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/ に書かれている。