終了ステータス
コンピュータプログラミングにおけるプロセスの終了ステータス(英: exit status)またはリターンコード(英: return code)とは、子プロセス(または呼び出された側)が具体的な手続きや委任されたタスクを実行完了した際、親プロセス(または呼び出した側)に渡す小さな数である。MS-DOSのCOMMAND.COMではERRORLEVELという。
プログラムを実行するとき、オペレーティングシステム (OS) はプロセスと呼ばれる、プログラムの「活動実体」を生成し、その中にそのプログラムのための情報を保持する。UNIXやLinuxなどのマルチタスクOSでは、新たなプロセスは動作可能プロセスとして生成される。別のプロセスを生成するプロセスを「親プロセス」と呼び、生成された側を「子プロセス」と呼ぶ。子プロセスと親プロセスは同時並行的に動作する。子プロセスが実行完了したとき、exitシステムコールを呼び出すことで終了する。このシステムコールが終了ステータスのコードを親プロセスに渡す役割を果たし、親プロセスはwaitシステムコールでその値を受け取ることができる。子プロセスが exit を呼び出して終了してから、親プロセスが wait を呼び出して受け取るまでの間の、子プロセスの状態を幽霊(米国ではゾンビ)と呼ぶ[1]。
意味論
[編集]親プロセスと子プロセスの間で終了ステータスの意味について認識を合わせることができる。例えば一般に、子プロセスがゼロを返したとき親プロセスは正常終了だと判断する。終了ステータス以外にも、シグナルなどを使って親プロセスに子プロセスの終了時の状態を通知することは可能である。
どのようなコードを返すかは、プログラム毎に独自に決めている。一般に成功(正常終了)か失敗(異常終了)かを示すことが多い。関数やプログラムが返すコードの値で、失敗の原因を示すこともある。多くのシステムでは、値が大きければ大きいほどエラーの原因が深刻であることを表すようにしている[2]。それとは別に、ビット毎に意味を持たせ、それらの論理和で終了ステータスを決定することもある。例えば、fsckがそのようにしている。 時には、終了ステータスをうまく設計し、呼び出した側のプログラムがそれをそのまま条件分岐のインデックスとして使うということも可能である。
bash
[編集]bash の終了ステータスの範囲は 0 から 255 で、0 は正常終了、それ以外は異常終了である。
範囲外の整数が exit
に渡された場合、終了ステータスは 256 の剰余となる。
直前のコマンドの終了ステータスは $?
で取得でき、if
, &&
, ||
などの制御演算子で利用できる。
以下の終了ステータスが予約されている。[3]
終了ステータス | 意味 |
---|---|
1 | 一般的なエラー |
2 | ビルトインコマンドの誤用 |
126 | コマンドを実行できなかった(実行権限がなかった) |
127 | コマンドが見つからなかった |
128 | exit に不正な値を渡した(例えば浮動小数点数)
|
128+n | シグナル n で終了 |
255 | 範囲外の終了ステータス |
C言語
[編集]C言語では、main関数からの復帰で整数値を返すことで成功か失敗かを通知することができ、そのためのマクロEXIT_SUCCESS
とEXIT_FAILURE
もある。POSIXではEXIT_SUCCESS
は0、EXIT_FAILURE
は1とされている[4]。また exit()
関数で整数値や上述のマクロを引数に指定することで終了ステータスを指定することもできる。
EXIT_SUCCESS
とEXIT_FAILURE
を除けば、Cの標準ではリターンコードの意味を全く定義していない。したがって、リターンコードについての規則はプラットフォームによって異なる。
Java
[編集]Javaでは、セキュリティマネージャが禁止していない限り、任意のメソッドから System.exit(int status)
を呼び出すことができる。それによって動作中のJava仮想マシンが終了する。引数はステータスコードとして扱われ、慣習的にゼロでないステータスコードは異常終了を表すものとされている[5]。
OSごとの詳細
[編集]Unix系
[編集]Unix系では、wait
システムコールがセットするステータスは子プロセスの終了時の各種情報をまとめたビットフィールドで構成されている。子プロセスが正常終了した場合(WIFEXITEDマクロで判定する。他にはシグナル受信で終了させられる場合がある)、SUSではステータスの下位8ビットが子プロセスが設定した終了ステータスを示すことになっている[6]。その値は wait.h
に定義されたマクロ WEXITSTATUS で取得することができる。このため、Unix系の終了ステータスの値は0から255まで(8ビット符号なし整数)に限られている(それ以上の値を指定しても親プロセス側が下位8ビットしか受け取れない)。
慣習的に正常終了時はゼロ、異常終了時はゼロ以外を返すのが一般的である[7]。各種エラーコードの意味について規約を定めようとした例もある。例えばGNUは上位ビットを深刻なエラーを示すために予約することを推奨している[4]。BSDではさらに細かく推奨される解釈を文書化している[8][9][10]。
DOS
[編集]DOSでは終了ステータスをエラーレベルとも呼ぶ。通常、0から255までの値をとる。バッチファイルで終了ステータスを参照するコマンドとしてERRORLEVEL
があり、指定した値以上かどうかで判断するようになっている。
OpenVMS
[編集]OpenVMSでは、正常終了を奇数値、異常終了を偶数値で表す。終了スタータスは32ビット整数だが、サブフィールドに分割されており、制御ビット群、ファシリティ番号、メッセージ番号、深刻度で構成される。深刻度の値は正常 (Success, Informational) と異常 (Warning, Error, Fatal) に分けられる[11]。
Windows
[編集]Windowsでは終了コードとして32ビット符号付き整数を使用する[12]。プロセスの初期化時点で失敗した場合、Windowsのシステムエラーコードが返される[13]。Windowsのシステムエラーコードはオンラインで公開されている[14]。
cmd.exeの errorlevel
はCOMMAND.COMのそれをそのまま継承している。.NET Framework のプロセスと Windows PowerShell は終了ステータスを Process
オブジェクトの ExitCode
属性として参照する。
脚注
[編集]- ^ 村井純、井上尚司、砂原秀樹『プロフェッショナルUNIX』株式会社アスキー、1986年1月15日、52頁。ISBN 4-87148-184-0。
- ^ “Errorlevels”. Rob van der Woude's Scripting Pages. 2007年8月26日閲覧。
- ^ Mendel Cooper. “Exit Codes With Special Meanings”. 2018年6月21日閲覧。
- ^ a b “The GNU C Library Reference Manual 25.6.2: Exit Status”. GNUプロジェクト. 2012年7月9日閲覧。
- ^ “Java 1.6.0 API”. Sun. 2008年5月6日閲覧。
- ^
wait(2)
– Linux System Calls Manual (en) - ^ “Chapter 6. Exit and Exit Status”. Faqs.org. 2012年7月9日閲覧。
- ^
sysexits(3)
: preferable exit codes for programs – FreeBSD Library Functions Manual Pages (en) - ^ sysexits(3): preferable exit codes for programs – NetBSD Manual Pages
- ^
sysexits(3)
: exit codes for programs – OpenBSD Library Functions マニュアル - ^ “OpenVMS Format of Return Status Values”. H71000.www7.hp.com. 2012年7月9日閲覧。
- ^ “ExitCodes bigger than 255, possible?”. 2009年9月28日閲覧。
- ^ “Windows System Error Codes (exit codes)”. 2009年9月28日閲覧。
- ^ “MSDN article System Error Codes”. Microsoft. 2012年7月30日閲覧。