quick exitによるプログラムの終了処理

提供: C言語入門
移動: 案内検索
スポンサーリンク

プログラムを終了する前に、プログラムでクリーンアップしておくべき処理を実行する必要があるとき、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によるプログラムの終了処理



スポンサーリンク