atexit関数
atexit関数に登録しておいた関数をmainの終了後, または, exitが呼ばれた後に実行することができる.
__atribute__のdestructorと同じなのかな?
とりあえず, サンプル.
#include<stdio.h> #include<stdlib.h> void test( void ); int main( int argc, char *argv[] ) { atexit( test ); puts( "main" ); return 0; } void test( void ) { puts( "test" ); }
こいつの実行結果.
[khiker@khlin001 ~/<1>c/gcc]$ ./test_atexit1 main test
まあ, 予想通り.
例によって複数登録して実験してみる.
まあ複数といっても2つだけど.
#include<stdio.h> #include<stdlib.h> void test( void ); void test2( void ); int main( int argc, char *argv[] ) { atexit( test ); atexit( test2 ); puts( "main" ); return 0; } void test( void ) { puts( "test" ); } void test2( void ) { puts( "test2" ); }
こいつの実行結果.
[khiker@khlin001 ~/<1>c/gcc]$ ./test_atexit1 main test2 test
結果から考えるに, スタックと同じってことなのかな?
後に atexit に登録したものから実行されるっていう.
プログラムを強制終了(C-cとかで)させたときは実行されないらしい.
while文で永遠に実行しつづけるプログラムを作って実験してみたけど, その通り実行されなかった.
これは, atexit だろうと, destructor だろうと同じだった.
それはそうと, ファイル名が test_atexit1.c とか test_atexit2.c とかいう名前だと
Emacsのオートセーブが効かなかった(他は大丈夫).
オートセーブのソースにある auto-save-reject-buffers-regexp が何か関係してんのかなあ.
問題ある風に思えないけど( "\\(\.texi\\|/[0-9]+$\\|spam\\)" ).