「C言語のexit関数の使い方」の版間の差分
行29: | 行29: | ||
補足になりますが、シェルでは、コマンドを実行したときに、終了ステータスは、シェルの特別な $? 変数に格納されています。 | 補足になりますが、シェルでは、コマンドを実行したときに、終了ステータスは、シェルの特別な $? 変数に格納されています。 | ||
== exit関数の引数に渡す値 == | == exit関数の引数に渡す値 == | ||
− | exit関数に渡す値は、0や1などの即値が使われることも多いですが、 '''EXIT_SUCCESS''' や '''EXIT_FAILURE''' | + | exit関数に渡す値は、0や1などの即値が使われることも多いですが、 '''EXIT_SUCCESS''' や '''EXIT_FAILURE''' もよく利用されます。0 から 255 の正の整数です。 |
即値を利用するとプログラムの意味がわかりにくくなるため、標準化のために、'''sysexits.h''' のヘッダファイルに定義されています。 | 即値を利用するとプログラムの意味がわかりにくくなるため、標準化のために、'''sysexits.h''' のヘッダファイルに定義されています。 | ||
行42: | 行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:10時点における版
C言語/C++言語のプログラムは、exit関数を使用することで、終了できます。コードを読むと、exit(0)とかexit(1)など、よく見かけると思います。一体、どういった違いがあるのでしょうか?
読み方
- 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_SUCCESS や EXIT_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 に定義されています。