終了ステータス

プロセスの終了ステータス(リターンコード)とは



コンピュータプログラミングにおいて、プロセスが完了した際に親プロセスに返す数値のことを終了ステータス、またはリターンコードと呼びます。これは、子プロセスが実行した処理の結果を親プロセスに伝えるための重要な手段です。MS-DOSではERRORLEVELと呼ばれていました。

プロセスの生成と終了



プログラムを実行すると、[オペレーティングシステム]プロセスと呼ばれる活動実体を生成し、プログラムの実行に必要な情報を保持します。マルチタスクOSでは、新たなプロセスは動作可能な状態として生成されます。プロセスを生成するプロセスを「親プロセス」、生成されたプロセスを「子プロセス」と呼びます。親プロセスと子プロセスは並行して動作し、子プロセスが処理を終えると、`exit`システムコールを通じて終了します。この時、終了ステータスが親プロセスに渡され、親プロセスは`wait`システムコールでその値を受け取ります。子プロセスが終了し、親プロセスが`wait`するまでの間、子プロセスは「幽霊」(ゾンビ)状態となります。

終了ステータスの意味



終了ステータスの意味は、親プロセスと子プロセスの間で事前に取り決められます。一般的には、0が正常終了を、それ以外の値が異常終了を示すことが多いです。エラーの内容を細かく伝えるために、特定の値に意味を持たせることもあります。例えば、大きな値ほど深刻なエラーを表す、あるいはビット毎に意味を持たせて論理和で表現するなどの方法があります。
また、終了ステータスを親プロセスが条件分岐のインデックスとして利用できるように設計することも可能です。

各環境における終了ステータス



bash


bashでは、終了ステータスは0から255の範囲で、0が正常終了、それ以外が異常終了を示します。範囲外の整数を指定した場合は256で割った余りがステータスとなります。直前のコマンドの終了ステータスは`$?`で取得でき、制御演算子`if`、`&&`、`||`などで利用できます。いくつかの終了ステータスは予約されており、特定の意味を持たせることがあります。

C言語


C言語では、`main`関数の戻り値で成功(`EXIT_SUCCESS`)または失敗(`EXIT_FAILURE`)を通知できます。POSIXでは、`EXIT_SUCCESS`は0、`EXIT_FAILURE`は1と定義されています。`exit()`関数を使用しても終了ステータスを指定できます。C言語の標準では、これらの定義以外にリターンコードの意味は定義されておらず、プラットフォームによって規則が異なります。

Java


Javaでは、`System.exit(int status)`メソッドでJava仮想マシンを終了させることができます。引数の`status`が終了ステータスとなり、慣例的に0以外の値は異常終了を表します。

OSごとの詳細


Unix系


Unix系では、`wait`システムコールで取得できるステータスはビットフィールドで構成されており、その下位8ビットが子プロセスの終了ステータスです。これは`WEXITSTATUS`マクロで取得できます。そのため、Unix系の終了ステータスは0から255の範囲に限定されます。一般的に正常終了は0、異常終了は0以外を返します。エラーコードの規約を定めようとする試みもあります。例えば、GNUは上位ビットを深刻なエラーのために予約することを推奨し、BSDではより詳細な解釈を文書化しています。

DOS


DOSでは、終了ステータスはエラーレベルとも呼ばれ、通常0から255の値を持ちます。バッチファイルでは`ERRORLEVEL`コマンドでステータスを参照し、指定した値以上かどうかを判断します。

OpenVMS


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

Windows


Windowsでは、終了コードは32ビット符号付き整数で表現されます。プロセスの初期化に失敗した場合、Windowsのシステムエラーコードが返されます。`cmd.exe`の`errorlevel`は`COMMAND.COM`のものを継承しています。.NET FrameworkプロセスやWindows PowerShellでは、終了ステータスをProcessオブジェクトのExitCode属性として参照できます。

脚注



終了ステータスは、プログラムの実行結果を正確に伝達するための重要なメカニズムです。プログラムが正常に動作したかどうかを判断し、エラー発生時にはその原因を特定する上で役立ちます。各環境での取り扱いを理解することで、より堅牢なプログラムを作成することができます。

関連項目



もう一度検索

【記事の利用について】

タイトルと記事文章は、記事のあるページにリンクを張っていただければ、無料で利用できます。
※画像は、利用できませんのでご注意ください。

【リンクついて】

リンクフリーです。