「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 | ||
− | [ | + | </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
関連項目
- プログラムの終了とステータス
- quick_exitによるプログラムの終了処理
- atexitによるプログラムの終了処理