終了ステータス

コンピュータプログラミングにおけるプロセスの終了ステータス（英: ）またはリターンコード（英: ）とは、子プロセス（または呼び出された側）が具体的な手続きや委任されたタスクを実行完了した際、親プロセス（または呼び出した側）に渡す小さな数である。DOSのCOMMAND.COMではERRORLEVELという。

プログラムを実行するとき、オペレーティングシステム (OS) はプロセスと呼ばれる、プログラムの「活動実体」を生成し、その中にそのプログラムのための情報を保持する。UNIXやLinuxなどのマルチタスクOSでは、新たなプロセスは動作可能プロセスとして生成される。別のプロセスを生成するプロセスを「親プロセス」と呼び、生成された側を「子プロセス」と呼ぶ。子プロセスと親プロセスは同時並行的に動作する。子プロセスが実行完了したとき、システムコールを呼び出すことで終了する。このシステムコールが終了ステータスのコードを親プロセスに渡す役割を果たし、親プロセスはシステムコールでその値を受け取ることができる。子プロセスが exit を呼び出して終了してから、親プロセスが wait を呼び出して受け取るまでの間の、子プロセスの状態を幽霊(米国ではゾンビ)と呼ぶ。

 意味論 
親プロセスと子プロセスの間で終了ステータスの意味について認識を合わせることができる。例えば一般に、子プロセスがゼロを返したとき親プロセスは正常終了だと判断する。終了ステータス以外にも、シグナルなどを使って親プロセスに子プロセスの終了時の状態を通知することは可能である。

どのようなコードを返すかは、プログラム毎に独自に決めている。一般に成功（正常終了）か失敗（異常終了）かを示すことが多い。関数やプログラムが返すコードの値で、失敗の原因を示すこともある。多くのシステムでは、値が大きければ大きいほどエラーの原因が深刻であることを表すようにしている。それとは別に、ビット毎に意味を持たせ、それらの論理和で終了ステータスを決定することもある。例えば、fsckがそのようにしている。
時には、終了ステータスをうまく設計し、呼び出した側のプログラムがそれをそのまま条件分岐のインデックスとして使うということも可能である。

 bash 

bash の終了ステータスの範囲は 0 から 255 で、0 は正常終了、それ以外は異常終了である。
範囲外の整数が exit に渡された場合、終了ステータスは 256 の剰余となる。
直前のコマンドの終了ステータスは $? で取得でき、if, &&, || などの制御演算子で利用できる。

以下の終了ステータスが予約されている。

 終了ステータス  意味 1  一般的なエラー 2  ビルトインコマンドの誤用 126  コマンドを実行できなかった（実行権限がなかった） 127  コマンドが見つからなかった 128  exit に不正な値を渡した（例えば浮動小数点数） 128+n  シグナル n で終了 255  範囲外の終了ステータス

 C言語 
C言語では、からの復帰で整数値を返すことで成功か失敗かを通知することができ、そのためのマクロEXIT_SUCCESSとEXIT_FAILUREもある。POSIXではEXIT_SUCCESSは0、EXIT_FAILUREは1とされている。また exit() 関数で整数値や上述のマクロを引数に指定することで終了ステータスを指定することもできる。

EXIT_SUCCESSとEXIT_FAILUREを除けば、Cの標準ではリターンコードの意味を全く定義していない。したがって、リターンコードについての規則はプラットフォームによって異なる。

 Java 
Javaでは、セキュリティマネージャが禁止していない限り、任意のメソッドから System.exit(int status) を呼び出すことができる。それによって動作中のJava仮想マシンが終了する。引数はステータスコードとして扱われ、慣習的にゼロでないステータスコードは異常終了を表すものとされている。

 OSごとの詳細 
 Unix系 
Unix系では、waitシステムコールがセットするステータスは子プロセスの終了時の各種情報をまとめたビットフィールドで構成されている。子プロセスが正常終了した場合（WIFEXITEDマクロで判定する。他にはシグナル受信で終了させられる場合がある）、SUSではステータスの下位8ビットが子プロセスが設定した終了ステータスを示すことになっている。その値は wait.h に定義されたマクロ WEXITSTATUS で取得することができる。このため、Unix系の終了ステータスの値は0から255まで（8ビット符号なし整数）に限られている（それ以上の値を指定しても親プロセス側が下位8ビットしか受け取れない）。

慣習的に正常終了時はゼロ、異常終了時はゼロ以外を返すのが一般的である。各種エラーコードの意味について規約を定めようとした例もある。例えばGNUは上位ビットを深刻なエラーを示すために予約することを推奨している。BSDではさらに細かく推奨される解釈を文書化しているsysexits(3): preferable exit codes for programs – NetBSD Manual Pages。

 DOS 
DOSでは終了ステータスをエラーレベルとも呼ぶ。通常、0から255までの値をとる。バッチファイルで終了ステータスを参照するコマンドとしてERRORLEVELがあり、指定した値以上かどうかで判断するようになっている。

 OpenVMS 
OpenVMSでは、正常終了を奇数値、異常終了を偶数値で表す。終了スタータスは32ビット整数だが、サブフィールドに分割されており、制御ビット群、ファシリティ番号、メッセージ番号、深刻度で構成される。深刻度の値は正常 (Success, Informational) と異常 (Warning, Error, Fatal) に分けられる。

 Windows 
Windowsでは終了コードとして32ビット符号付き整数を使用する。プロセスの初期化時点で失敗した場合、Windowsのシステムエラーコードが返される。Windowsのシステムエラーコードはオンラインで公開されている。

cmd.exeの errorlevel はCOMMAND.COMのそれをそのまま継承している。.NET Framework のプロセスと Windows PowerShell は終了ステータスを Process オブジェクトの ExitCode 属性として参照する。

 脚注 

 関連項目 
 Return文
 true (UNIX) と false (UNIX)

Category:OSのプロセス管理