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\\)" ).