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