255を超えるExitCodesは可能ですか?
-
05-07-2019 - |
質問
「はい」の場合、どのオペレーティングシステム、シェルなどで使用しますか?
次のJavaプログラムを検討してください(例としてJavaを使用していますが、この質問にはどの言語でも使用できます。オペレーティングシステムの詳細です):
public class ExitCode {
public static void main(String args[]) {
System.exit(Integer.parseInt(args[0]));
}
}
Linuxおよびbashで実行すると、常に255以下の値が返されます。 ( echo $?
は、前に実行されたコマンドの終了コードを出力します)
> java ExitCode 2; echo $?
2
> java ExitCode 128; echo $?
128
> java ExitCode 255; echo $?
255
> java ExitCode 256; echo $?
0
> java ExitCode 65536; echo $?
0
編集済み:(これまでのところ)以下の回答は、UNIXで何が起こるかを完全に説明しています。私はまだ他のOSについて疑問に思っています。
解決
Unixおよび派生物では不可能です。返される終了ステータス情報は、2つの8ビットフィールドで構成されます。1つは終了ステータスを含み、もう1つは死の原因に関する情報を含みます(0はプログラム制御下での秩序ある終了を意味し、他の値はシグナルがそれを殺したことを示し、コアがダンプされました)。
他のヒント
最新のWindows、OS自体、およびデフォルトのコンソールシェル( CMD.EXE
)では、少なくとも32ビットの符号付き整数の範囲全体で終了コードを受け入れて表示します。 CMD.EXE
で上記の例を実行すると、要求した終了コードが表示されます。
> java ExitCode 2
> echo %errorlevel%
2
> java ExitCode 128
> echo %errorlevel%
128
> java ExitCode 255
> echo %errorlevel%
255
> java ExitCode 256
> echo %errorlevel%
256
> java ExitCode 65536
> echo %errorlevel%
65536
Windowsには実際にはUnixシグナルの概念がなく、シェル(または終了プログラムを読み取るプログラム)が実行しない限り、終了コードをハイジャックして追加情報を追加しようとしません。どちらか、返された終了コードを取得する必要があります。幸いなことに、MicrosoftのCランタイムを使用するプログラム(MS Visual C ++でコンパイルされたすべてのプログラムを含む)は、終了プロセスからの終了コードをそのまま保持します。
Windowsにはさらに多くの終了コードがあり、14,000を超えています。 (あなたは自分のスクリーンでそれらのいくつかをしばしば見たと確信しています。)
こちら: