「C言語のexit関数の使い方」の版間の差分

提供: C言語入門
移動: 案内検索
(ページの作成:「'''C言語'''/'''C++言語'''のプログラムは、exit関数を使用することで、終了できます。コードを読むと、exit(0)とかexit(1)など、よく...」)
 
 
(同じ利用者による、間の2版が非表示)
行1: 行1:
'''C言語'''/'''C++言語'''のプログラムは、exit関数を使用することで、終了できます。コードを読むと、exit(0)とかexit(1)など、よく見かけると思います。一体、どういった違いがあるのでしょうか?
+
'''C言語'''/'''C++言語'''のプログラムは、exit関数を使用することで、終了できます。コードを読むと、exit(0)とかexit(1)など、よく見かけると思います。一体、どういった違いがあるのでしょうか?また、returnとexitについても解説します。
  
 
'''読み方'''
 
'''読み方'''
行26: 行26:
 
終了ステータスを受け取る意味は、実行したプログラムが成功したのか、それとも失敗したのかを知ることができることです。
 
終了ステータスを受け取る意味は、実行したプログラムが成功したのか、それとも失敗したのかを知ることができることです。
 
たとえば、 grep のコマンドを実行して、成功した場合と失敗した場合で、やりたいことが変わります。grep で特定のキーワードが見つかったら、それらを抽出して、処理する、といったプログラムができます。grepに失敗した場合は、なにもすることがないので、処理を終了する、といったことが考えられます。
 
たとえば、 grep のコマンドを実行して、成功した場合と失敗した場合で、やりたいことが変わります。grep で特定のキーワードが見つかったら、それらを抽出して、処理する、といったプログラムができます。grepに失敗した場合は、なにもすることがないので、処理を終了する、といったことが考えられます。
 +
 +
補足になりますが、シェルでは、コマンドを実行したときに、終了ステータスは、シェルの特別な $? 変数に格納されています。
 
== exit関数の引数に渡す値 ==
 
== exit関数の引数に渡す値 ==
exit関数に渡す値は、0や1などの即値が使われることも多いですが、 '''EXIT_SUCCESS''' や '''EXIT_FAILURE''' もよく利用されます。
+
exit関数に渡す値は、0や1などの即値が使われることも多いですが、 '''EXIT_SUCCESS''' や '''EXIT_FAILURE''' もよく利用されます。0 から 255 の正の整数です。
  
 
即値を利用するとプログラムの意味がわかりにくくなるため、標準化のために、'''sysexits.h''' のヘッダファイルに定義されています。
 
即値を利用するとプログラムの意味がわかりにくくなるため、標準化のために、'''sysexits.h''' のヘッダファイルに定義されています。
行40: 行42:
  
 
詳しくは、sysexits の jman/man をご確認下さい。
 
詳しくは、sysexits の jman/man をご確認下さい。
 +
== return(-1);について ==
 +
main関数でreturn(-1);というコードを見かけた人もいるかと思います。
 +
-1ではなく、0から255の値で返してあげましょう。というのは、終了ステータスに負の値をあつかえないからです。
 +
== main関数でのreturn(0)とexit(0)の違いは? ==
 +
main関数でreturn(0);と書いているコードは、世の中に五万とあります。
 +
return(0);とexit(0);は、結果的に、同じ意味になります。
 +
プログラムの動作としては、return(0);の場合は、main関数の呼び出し元に戻ってから、プログラムの終了になります。main関数の呼び出し元は、実装によると考えられますが、Cスタートアップルーチンでしょう。
 +
exit(0);を呼び出した場合は、即座にプログラムが終了し、main関数の呼び出し元に戻らずにプログラムは終了されます。
 +
 +
プログラムが終了したい場合は、returnではなく、exit関数を利用したほうが良いでしょう。
 
== ヘッダファイル ==
 
== ヘッダファイル ==
 
exit関数のヘッダファイルの読込は下記の通りです。
 
exit関数のヘッダファイルの読込は下記の通りです。

2016年4月16日 (土) 19:15時点における最新版

C言語/C++言語のプログラムは、exit関数を使用することで、終了できます。コードを読むと、exit(0)とかexit(1)など、よく見かけると思います。一体、どういった違いがあるのでしょうか?また、returnとexitについても解説します。

読み方

exit
いぐじっと

概要

プログラムを終了するときに、exit関数が利用されます。 exit関数を利用する場合は、stdlib.h をインクルードします。

exit関数は、慣例的に、以下のように使われます。

正常終了
exit(0);
異常終了
exit(1);

exit関数は、プログラムを実行した側に、プログラムの成功や失敗を伝える、一つの手段を提供します。0や1以外の値を利用することで、なぜ、失敗したのか?を使えることも可能になります。慣例的に、1以上は、異常終了と捉えて問題ありません。

exitの引数は?

exit関数の引数は、プログラムの終了ステータスを意味する値を渡します。

exitの引数の意味は?

exit関数を呼び出すことで、プログラムは終了します。

プログラムは、ほかのプログラムによって実行されます。 たとえば、Unix のシェルから実行したコマンドは、シェルが fork して、コマンドを exec (実行) します。シェルが実行したコマンドが成功したのか、失敗したのかを知る方法として、プログラムの終了ステータスがあります。プログラムの終了ステータスは、プログラムがexit関数を呼び出したときの引数の値になります。

exit(0); で終了したら、シェルは 0 を受け取ります。exit(1);で終了したら、シェルは1を受け取ります。

終了ステータスを受け取る意味は、実行したプログラムが成功したのか、それとも失敗したのかを知ることができることです。 たとえば、 grep のコマンドを実行して、成功した場合と失敗した場合で、やりたいことが変わります。grep で特定のキーワードが見つかったら、それらを抽出して、処理する、といったプログラムができます。grepに失敗した場合は、なにもすることがないので、処理を終了する、といったことが考えられます。

補足になりますが、シェルでは、コマンドを実行したときに、終了ステータスは、シェルの特別な $? 変数に格納されています。

exit関数の引数に渡す値

exit関数に渡す値は、0や1などの即値が使われることも多いですが、 EXIT_SUCCESSEXIT_FAILURE もよく利用されます。0 から 255 の正の整数です。

即値を利用するとプログラムの意味がわかりにくくなるため、標準化のために、sysexits.h のヘッダファイルに定義されています。

#include <sysexits.h>

いくつか例を挙げます。

EX_USAGE(64)
コマンドの引数に誤りがあったときに、利用します。
EX_OSERR(71)
OSのエラーが検出された場合に利用します。たとえば、パイプが作成できない、といったときに利用します。
EX_OSFILE(72)
OSの本来あるべきファイルがない、といったときに利用します。

詳しくは、sysexits の jman/man をご確認下さい。

return(-1);について

main関数でreturn(-1);というコードを見かけた人もいるかと思います。 -1ではなく、0から255の値で返してあげましょう。というのは、終了ステータスに負の値をあつかえないからです。

main関数でのreturn(0)とexit(0)の違いは?

main関数でreturn(0);と書いているコードは、世の中に五万とあります。 return(0);とexit(0);は、結果的に、同じ意味になります。 プログラムの動作としては、return(0);の場合は、main関数の呼び出し元に戻ってから、プログラムの終了になります。main関数の呼び出し元は、実装によると考えられますが、Cスタートアップルーチンでしょう。 exit(0);を呼び出した場合は、即座にプログラムが終了し、main関数の呼び出し元に戻らずにプログラムは終了されます。

プログラムが終了したい場合は、returnではなく、exit関数を利用したほうが良いでしょう。

ヘッダファイル

exit関数のヘッダファイルの読込は下記の通りです。

#include <stdlib.h>

ソースコード

以下は、exit関数の使い方の例です。

#include <stdlib.h>
int
main(int argc, char *argv[]) {
	if ( /* 処理 * /) {
		// エラー
		exit (EXIT_FAILURE);
	}
	exit (EXIT_SUCCESS);
}

まとめ

  • exit関数は、プログラムを終了させる関数です。
  • exit関数は、プログラムの終了ステータスを設定する関数です。
  • プログラムの呼び出し元は、実行したプログラムの終了ステータスで、プログラムの成功や失敗を判断できます。
  • exit関数に渡す値は、 sysexits.h に定義されています。

関連項目