名 前
atexit − プ ロ セ ス が 正 常 終 了 し た 時 に 呼 び 出 さ れ る 関 数 を 登 録 す る
書 式
#include <stdlib.h>
int atexit(void (*function)(void));
説 明
atexit() 関 数 は 、 与 え ら れ た function を 、 exit(3) や プ ロ グ ラ ム の main() 関 数 か ら の 返 り を 通 じ て 、 プ ロ セ ス が 正 常 終 了 し た 時 に 呼 び 出 さ れ る 関 数 と し て 登 録 す る 。 こ こ で 定 義 さ れ た 関 数 は 、 登 録 し た 順 番 と は 逆 の 順 番 で 呼 び 出 さ れ る 。 登 録 し た 関 数 に 引 き 数 は 渡 さ れ な い 。 同 じ 関 数 を 複 数 回 登 録 し て も よ い 。 登 録 さ れ た 関 数 は 登 録 1 回 に つ き 1 回 呼 び 出 さ れ る 。
POSIX.1−2001 で は 、 こ の よ う な 関 数 を 少 な く と も ATEXIT_MAX 個 (32個 ) 登 録 で き る こ と を 要 求 し て い る 。 そ の 実 装 で サ ポ ー ト さ れ て い る 実 際 の 上 限 は sysconf(3) を 使 っ て 取 得 で き る 。
fork(2) で 作 成 さ れ た 場 合 、 子 プ ロ セ ス は 親 プ ロ セ ス の 登 録 の コ ピ ー を 継 承 す る 。 exec(3) フ ァ ミ リ ー の 関 数 の 場 合 、 呼 び 出 し に 成 功 す る と 、 全 て の 登 録 が 削 除 さ れ る 。
返 り 値
atexit() 関 数 は 、 関 数 登 録 が 成 功 し た 時 に は 0 を 返 す 。 そ の 他 の 場 合 に は 0 以 外 の 値 を 返 す 。
準 拠
SVr4, 4.3BSD, C89, C99, POSIX.1−2001.
注 意
atexit() (と on_exit(3)) を 使 っ て 登 録 さ れ た 関 数 は 、 シ グ ナ ル の 配 送 に よ り プ ロ セ ス が 異 常 終 了 し た 場 合 に は 呼 び 出 さ れ な い 。 登 録 さ れ た 関 数 の 一 つ が _exit(2) を 呼 び 出 し た 場 合 、 残 り の 関 数 は ど れ も 起 動 さ れ ず 、 exit(3) に よ り 実 行 さ れ る 他 の プ ロ セ ス 終 了 ス テ ッ プ は 実 行 さ れ な い 。
POSIX.1−2001 で は 、 atexit() を 使 っ て 登 録 さ れ た 一 つ の 関 数 内 で 、 複 数 回 exit(3) を 呼 び 出 し た 際 の 結 果 は 未 定 義 で あ る 。 (Linux で は な い が ) い く つ か の シ ス テ ム で は 、 こ の 場 合 、 繰 り 返 し が 無 限 に 起 こ る こ と に な る 。 移 植 性 が 必 要 な プ ロ グ ラ ム で は 、 atexit() で 登 録 さ れ た 関 数 内 で exit(3) を 起 動 す べ き で は な い 。
atexit() と on_exit(3) は 、 同 じ リ ス ト に 対 し て 関 数 を 登 録 す る 。 プ ロ セ ス が 正 常 に 終 了 し た 際 に は 、 こ れ ら の 二 つ の 関 数 で 登 録 さ れ た 順 序 の 逆 順 で 、 登 録 さ れ た 関 数 が 起 動 さ れ る 。
POSIX.1−2001 で は 、 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); }
関 連 項 目
こ の 文 書 に つ い て
こ の man ペ ー ジ は Linux man−pages プ ロ ジ ェ ク ト の リ リ ー ス 3.79 の 一 部 で あ る 。 プ ロ ジ ェ ク ト の 説 明 と バ グ 報 告 に 関 す る 情 報 は http://www.kernel.org/doc/man−pages/ に 書 か れ て い る 。