プロセスの終了ステータス(リターンコード)とは
コンピュータプログラミングにおいて、
プロセスが完了した際に親
プロセスに返す数値のことを終了ステータス、またはリターンコードと呼びます。これは、子
プロセスが実行した処理の結果を親
プロセスに伝えるための重要な手段です。
MS-DOSではERRORLEVELと呼ばれていました。
プログラムを実行すると、
[オペレーティングシステム]は
プロセスと呼ばれる活動実体を生成し、プログラムの実行に必要な情報を保持します。
マルチタスクOSでは、新たな
プロセスは動作可能な状態として生成されます。
プロセスを生成する
プロセスを「親
プロセス」、生成された
プロセスを「子
プロセス」と呼びます。親
プロセスと子
プロセスは並行して動作し、子
プロセスが処理を終えると、`exit`
システムコールを通じて終了します。この時、終了ステータスが親
プロセスに渡され、親
プロセスは`wait`
システムコールでその値を受け取ります。子
プロセスが終了し、親
プロセスが`wait`するまでの間、子
プロセスは「幽霊」(ゾンビ)状態となります。
終了ステータスの意味
終了ステータスの意味は、親
プロセスと子
プロセスの間で事前に取り決められます。一般的には、0が正常終了を、それ以外の値が異常終了を示すことが多いです。エラーの内容を細かく伝えるために、特定の値に意味を持たせることもあります。例えば、大きな値ほど深刻なエラーを表す、あるいはビット毎に意味を持たせて
論理和で表現するなどの方法があります。
また、終了ステータスを親
プロセスが条件分岐のインデックスとして利用できるように設計することも可能です。
各環境における終了ステータス
bash
bashでは、終了ステータスは0から255の範囲で、0が正常終了、それ以外が異常終了を示します。範囲外の
整数を指定した場合は256で割った余りがステータスとなります。直前のコマンドの終了ステータスは`$?`で取得でき、制御演算子`if`、`&&`、`||`などで利用できます。いくつかの終了ステータスは予約されており、特定の意味を持たせることがあります。
C言語では、`main`関数の戻り値で成功(`EXIT_SUCCESS`)または失敗(`EXIT_FAILURE`)を通知できます。
POSIXでは、`EXIT_SUCCESS`は0、`EXIT_FAILURE`は1と定義されています。`exit()`関数を使用しても終了ステータスを指定できます。
C言語の標準では、これらの定義以外にリターンコードの意味は定義されておらず、プラットフォームによって規則が異なります。
Javaでは、`System.exit(int status)`メソッドで
Java仮想マシンを終了させることができます。引数の`status`が終了ステータスとなり、慣例的に0以外の値は異常終了を表します。
OSごとの詳細
Unix系では、`wait`
システムコールで取得できるステータスは
ビットフィールドで構成されており、その下位8ビットが子
プロセスの終了ステータスです。これは`WEXITSTATUS`マクロで取得できます。そのため、
Unix系の終了ステータスは0から255の範囲に限定されます。一般的に正常終了は0、異常終了は0以外を返します。エラーコードの規約を定めようとする試みもあります。例えば、GNUは上位ビットを深刻なエラーのために予約することを推奨し、BSDではより詳細な解釈を文書化しています。
DOS
DOSでは、終了ステータスはエラーレベルとも呼ばれ、通常0から255の値を持ちます。バッチファイルでは`ERRORLEVEL`コマンドでステータスを参照し、指定した値以上かどうかを判断します。
OpenVMSでは、正常終了を奇数値、異常終了を偶数値で表します。終了ステータスは32ビット
整数ですが、制御ビット群、ファシリティ番号、メッセージ番号、深刻度で構成され、深刻度は正常(Success, Informational)と異常(Warning, Error, Fatal)に分けられます。
Windows
Windowsでは、終了コードは32ビット符号付き
整数で表現されます。
プロセスの初期化に失敗した場合、Windowsのシステムエラーコードが返されます。`cmd.exe`の`errorlevel`は`COMMAND.COM`のものを継承しています。
.NET Frameworkの
プロセスやWindows PowerShellでは、終了ステータスをProcessオブジェクトのExitCode属性として参照できます。
脚注
終了ステータスは、プログラムの実行結果を正確に伝達するための重要なメカニズムです。プログラムが正常に動作したかどうかを判断し、エラー発生時にはその原因を特定する上で役立ちます。各環境での取り扱いを理解することで、より堅牢なプログラムを作成することができます。
関連項目