ユーニックス総合研究所

  • home
  • archives
  • c-exit

C言語のexit関数でプログラムを終了する方法

  • 作成日: 2022-02-10
  • 更新日: 2023-12-25
  • カテゴリ: C言語

C言語のexit関数でプログラムを終了する方法

C言語でプログラムを即座に終了させたいときに使うのが「exit関数」です。
exit関数を呼び出すとプログラムが即座に終了します。
そのときにexit関数の終了ステータスを指定することもできます。

プログラムを即座に終了させたいケースというのはけっこう多いものです。
たとえばエラー時、あるいは他の理由によるもの。

この記事ではC言語のexit関数の使い方について詳しく解説します。

関連記事

目が覚めるC言語のdo-while文の使い方【ループ処理、初心者向け】
明快!C言語のcontinue文の使い方
君はまだC言語のdefineのすべてを知らない【マクロ、プリプロセス】
プログラミングのポインタをわかりやすく解説【C言語】
コードで見るC言語とC++の7つの違い

exit関数の構造

exit関数は↓のような構造になっています。

#include <stdlib.h>  

void exit(int status);  

exit関数を使うには「stdlib.h」のインクルードが必要です。
exit関数は返り値は返しません。

exit関数は1つの引数statusを取ります。
これは「終了ステータス」と呼ばれる整数になります。

終了ステータスはそのプログラムがどのような状態で終了したかを表すものです。
一般的には0が正常終了、0以外が異常終了になります。

exit関数の使い方

exit関数は↓のように使います。

#include <stdlib.h>  

int main(void) {  
    exit(0);  // プログラムを終了する  
    return 0;  
}  

↑のようにexit関数を呼び出すと、exit関数を呼び出した時点でプログラムが終了します。
↑のコードではexit(0)とやって終了ステータスを0に設定しています。
そのためプログラムの終了ステータスは0になります。

「プログラムを終了する」とはどういうことか?

ここまで「プログラムが終了する」と当たり前のように書いてきましたが、これは具体的にはどういうことなのでしょうか?
プログラムが終了するとはどういう意味なのか?

プログラムが実行されると「プロセス」という活動単位が生成されます。
メモリが確保されて環境変数などがプロセスにセットされます。
そして私たちの書いたコードはそのプロセスの単位で動きます。

プロセスはプロセスから生成されます。
このとき親になっているプロセスを「親プロセス」、子供になっているプロセスを「子プロセス」と言います。

私たちが実行するプログラムはすでに起動しているプロセスの子プロセスとして実行されます。
たとえばコマンドプロンプトやBashなどの端末からプログラムを実行した場合は、親プロセスはその端末になります。

プロセスは終了するときに、そのプロセスがどのように終了したかを表す「終了ステータス」という整数を親プロセスに返すことができます。
exit関数の引数である整数はこの終了ステータスになります。
つまり端末などから実行されたプログラムが終了するときに、親プロセスである端末に返す整数がexit関数の引数の終了ステータスです。

プロセスが終了すると、その活動単位は消滅します。
これがプログラムが終了する場合の動作になります。

端末から子プロセスの終了ステータスを確認する

コマンドプロンプトBashなどの端末では実行したプログラム(子プロセス)の終了ステータスを見ることができます
たとえばコマンドプロンプトでは↓のようにすることで終了ステータスを確認できます。

> echo %ERRORLEVEL%  
0  

DOSでは終了ステータスのことを「エラーレベル」と言います。
↑のように%ERRORLEVEL%を参照すると直前に実行したプログラムの終了ステータスを確認できます。

Linuxなどで使われるBashでは↓のようにすると確認できます。

$ echo $?  
0  

↑のように$?を参照すると終了ステータスを確認できます。

終了ステータスは何に使われるのか?

終了ステータスが表すのは大きくわけて

  • 正常に終了した
  • 異常に終了した

の2つです。
これらは端末のスクリプトで活用されます。
たとえばコマンドプロンプトであれば「bat」ファイルなどがスクリプトで、Bashであれば「sh」ファイルなどがスクリプトになります。

これらのスクリプトではプログラムを連続して実行させることができます。
あるプログラムが正常に終了したら次のプログラムを実行し、あるプログラムが異常に終了したら次のプログラムを実行しない、といった条件分岐を書く際に終了ステータスは利用されます。

たとえばBashでは

prog1 && prog2  

というコマンドラインを実行した時、prog1が異常終了したらprog2は実行されません。
このように終了ステータスを活用することで複雑なスクリプトやコマンドラインを書くことができます。

EXIT_SUCCESSとEXIT_FAILURE

C言語では終了ステータスを表す定数として↓を使うことができます。

  • EXIT_SUCCESS
  • EXIT_FAILURE

EXIT_SUCCESSは正常終了の終了ステータスで、一般的にその値は0になっています。
EXIT_FAILUREは異常終了の終了ステータスで、一般的にその値は1になっています。
これらの定数は「stdlib.h」をインクルードすることで使うことができます。

これらの定数を使ったコードを書くのも一般的です。
しかし定数名を書くのがめんどくさいため即値(0や1)を書く人も多いです。

#include <stdlib.h>  

int main(void) {  
    exit(EXIT_SUCCESS);  
    return 0;  
}  

main関数の返り値の正体

ちなみにmain関数がreturnで返す整数も終了ステータスです
この値も親プロセスに返されます。

int main(void) {  
    return 0;  
}  

おわりに

今回はC言語のexit関数でプログラムを終了する方法を解説しました。
exit関数はいざという時によく使われる関数です。
プログラムを即座に終了させたい場合はexit関数を使いましょう。

🦝 < プログラムを即座に終了

🐭 < いさぎよい