「quick exitによるプログラムの終了処理」の版間の差分

提供: C言語入門
移動: 案内検索
(ページの作成:「プログラムを終了する前に、プログラムでクリーンアップしておくべき処理を実行する必要があるとき、at_quick_exit()で終了処...」)
 
 
行12: 行12:
 
at_quick_exit()は、quick_exit()が呼び出されたときに、実行する関数を登録するための関数です。
 
at_quick_exit()は、quick_exit()が呼び出されたときに、実行する関数を登録するための関数です。
 
quick_exit()は、exit()の代わりに使う関数で、at_quick_exit()で登録された関数を実行し、quic_exit()の引数で渡された値でプログラムを終了します。
 
quick_exit()は、exit()の代わりに使う関数で、at_quick_exit()で登録された関数を実行し、quic_exit()の引数で渡された値でプログラムを終了します。
 +
 +
クリーンアップ関数は、登録された順番と逆に呼び出されます。
 +
 +
exit(),_Exit()やabort()を呼び出した時には、クリーンアップ関数は呼び出されません。
 
== ヘッダファイル ==
 
== ヘッダファイル ==
 
<syntaxhighlight lang="c">
 
<syntaxhighlight lang="c">
 
#include <stdlib.h>
 
#include <stdlib.h>
 
</syntaxhighlight>
 
</syntaxhighlight>
== ソースコード ==
+
== クリーンアップ関数を登録する例 ==
 +
=== ソースコード ===
 
<syntaxhighlight lang="c">
 
<syntaxhighlight lang="c">
 
/*
 
/*
行47: 行52:
  
 
</syntaxhighlight>
 
</syntaxhighlight>
== コンパイル ==
+
=== コンパイル ===
 
<syntaxhighlight lang="bash">
 
<syntaxhighlight lang="bash">
 
cc quick_exit.c
 
cc quick_exit.c
 
</syntaxhighlight>
 
</syntaxhighlight>
== 実行例 ==
+
=== 実行例 ===
 
<syntaxhighlight lang="bash">
 
<syntaxhighlight lang="bash">
 
$ ./a.out
 
$ ./a.out
 
cleanup
 
cleanup
[2]   3491 exit 1    ./a.out
+
</syntaxhighlight>
 +
== 複数の関数を登録した場合 ==
 +
=== ソース ===
 +
<syntaxhighlight lang="c">
 +
/*
 +
* quick_exit.c
 +
* Copyright (C) 2014 kaoru <kaoru@bsd>
 +
*
 +
* Distributed under terms of the MIT license.
 +
*/
 +
#include <stdio.h>
 +
#include <stdlib.h>
 +
#include <err.h>
 +
 
 +
void
 +
cleanup1(void)
 +
{
 +
        (void)puts("cleanup1");
 +
}
 +
void
 +
cleanup2(void)
 +
{
 +
        (void)puts("cleanup2");
 +
}
 +
 
 +
int
 +
At_quick_exit( void (*func)(void) ){
 +
        int r = at_quick_exit(func);
 +
        if (0 != r) {
 +
                err(EXIT_FAILURE, "can not register cleanup function");
 +
        }
 +
        return r;
 +
}
 +
 
 +
int
 +
main(int argc, char *argv[])
 +
{
 +
        int r = 0;
 +
        r = At_quick_exit(cleanup1);
 +
        r = At_quick_exit(cleanup2);
 +
 
 +
        quick_exit(EXIT_FAILURE);
 +
        // NOTREACHED
 +
 
 +
        exit(EXIT_SUCCESS);
 +
}
 +
</syntaxhighlight>
 +
=== コンパイル ===
 +
<syntaxhighlight lang="bash">
 +
cc quick_exit.c
 +
</syntaxhighlight>
 +
=== 実行例 ===
 +
クリーンアップ関数は、登録された順番と逆に呼び出されます。
 +
<syntaxhighlight lang="bash">
 +
$ ./a.out
 +
cleanup2
 +
cleanup1
 
</syntaxhighlight>
 
</syntaxhighlight>
 
== 関連項目 ==
 
== 関連項目 ==

2014年3月30日 (日) 00:51時点における最新版

プログラムを終了する前に、プログラムでクリーンアップしておくべき処理を実行する必要があるとき、at_quick_exit()で終了処理を追加しておき、プログラムを終了しなければならないときに、quick_exit()を呼び出すことで、クリーンアップを行ってからプログラムを終了できます。

読み方

quick_exit
くいっく いくじっと
at_quick_exit
あっと くいっく いくじっと

概要

quick_exitは、C11で追加されました。libcとして提供されています。 似たような機能として、atexit()があります。

at_quick_exit()は、quick_exit()が呼び出されたときに、実行する関数を登録するための関数です。 quick_exit()は、exit()の代わりに使う関数で、at_quick_exit()で登録された関数を実行し、quic_exit()の引数で渡された値でプログラムを終了します。

クリーンアップ関数は、登録された順番と逆に呼び出されます。

exit(),_Exit()やabort()を呼び出した時には、クリーンアップ関数は呼び出されません。

ヘッダファイル

#include <stdlib.h>

クリーンアップ関数を登録する例

ソースコード

/*
 * quick_exit.c
 * Copyright (C) 2014 kaoru <kaoru@bsd>
 */
#include <stdio.h>
#include <stdlib.h>
#include <err.h>
 
void
cleanup(void)
{
        (void)puts("cleanup");
}
 
int
main(int argc, char *argv[])
{
        int r = at_quick_exit(cleanup);
        if (0 != r) {
                err(EXIT_FAILURE, "can not register cleanup function");
        }
 
        quick_exit(EXIT_FAILURE);
        // NOTREACHED
 
        exit(EXIT_SUCCESS);
}

コンパイル

cc quick_exit.c

実行例

$ ./a.out
cleanup

複数の関数を登録した場合

ソース

/*
 * quick_exit.c
 * Copyright (C) 2014 kaoru <kaoru@bsd>
 *
 * Distributed under terms of the MIT license.
 */
#include <stdio.h>
#include <stdlib.h>
#include <err.h>
 
void
cleanup1(void)
{
        (void)puts("cleanup1");
}
void
cleanup2(void)
{
        (void)puts("cleanup2");
}
 
int
At_quick_exit( void (*func)(void) ){
        int r = at_quick_exit(func);
        if (0 != r) {
                err(EXIT_FAILURE, "can not register cleanup function");
        }
        return r;
}
 
int
main(int argc, char *argv[])
{
        int r = 0;
        r = At_quick_exit(cleanup1);
        r = At_quick_exit(cleanup2);
 
        quick_exit(EXIT_FAILURE);
        // NOTREACHED
 
        exit(EXIT_SUCCESS);
}

コンパイル

cc quick_exit.c

実行例

クリーンアップ関数は、登録された順番と逆に呼び出されます。

$ ./a.out
cleanup2
cleanup1

関連項目

  1. プログラムの終了とステータス
  2. quick_exitによるプログラムの終了処理
  3. atexitによるプログラムの終了処理