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