C言語のプログラム終了時に呼ばれる関数

atexitを使うとプログラム終了時に呼ばれる関数を登録できる。(void (*)()の関数)
atexitは複数登録(スタックとして積まれる?)できるようで、後入れ先出しで実行される。
また、終了時の関数は少なくともATEXIT_MAX個(32個?)登録できるらしい。

使い方

#include <stdio.h>
#include <stdlib.h>

void func1();
void func2();
void func3();

int main() {
  atexit(func1);
  atexit(func2);
  atexit(func3);

  printf( "Enterキーを押すとプログラムを終了します\n" );
  getchar();

  return 0;
}

void func1() {
  printf( "終了中...func1\n" );
}

void func2() {
  printf( "終了中...func2\n" );
}

void func3() {
  printf( "終了中...func3\n" );
}

実行結果

$ ./atexit
Enterキーを押すとプログラムを終了します
[Enter入力]
終了中...func3
終了中...func2
終了中...func1

実験

exit, assert, abortをしてみる

Cygwin環境で実験したところ、exit関数では呼ばれるが、abortやassertで異常終了させた場合には呼ばれない。
また、killでプロセスを強制された場合にも呼ばれません。

#include <stdio.h>
#include <stdlib.h>

void func1();

int main() {
  atexit(func1);
  abort();  /* exit(0);やassert(0);でも実験 */

  return 0;
}

void func1() {
  printf( "終了中...func1\n" );
  atexit(func2);
}
終了処理時にatexitをしてみる
#include <stdio.h>
#include <stdlib.h>

void func1();
void func2();

int main() {
  atexit(func1);

  printf( "Enterキーを押すとプログラムを終了します\n" );
  getchar();

  return 0;
}

void func1() {
  printf( "終了中...func1\n" );
  atexit(func2);
}

void func2() {
  printf( "終了中...func2\n" );
}

これはダメなようです。終了以前に登録された関数のみ実行されるようです。

$ ./atexit
Enterキーを押すとプログラムを終了します

終了中...func1

まとめ

大域変数でとかのメモリの解放とかには使えるかな。(あまり使わないけど・・
あとは、終了時のメッセージを出すのとかには使える!!
メモメモ