回答:
UNIX / POSIXでは、プログラムの終了コードは符号なし8ビット値として定義されているためです。-1を符号なし8ビットに変換すると、255になります。
編集して追加:
詳細については、UNIXのシステムコールのwait *()ファミリは、プロセスの結果を単一の32ビット整数にエンコードします。その結果の32ビットはさらに分割されて、プロセスがコアをダンプしたか、シグナルが原因で終了したか(およびどれか)などの情報を提供します。その32ビットのうち、プロセスの終了コード用に予約されているのは8つだけです。そしてそれらは符号なしの値として解釈されます。
UNIX / POSIXのfork / exec / waitモデルは、その最も古く、最も深く埋め込まれた機能の1つです。今日新しいオペレーティングシステムを設計している場合は、何か別のことをするかもしれません(少なくとも64ビットを使用する:-))。
一方、実際に言えば、255を超える終了コードを持つことは本当に便利ですか?疑わしい。より強力なものが本当に必要な場合は、より広い範囲の数値の終了コードではなく、「終了文字列」に切り替えることをお勧めします。
終了ステータスのbash
manページから引用するには
実行されたコマンドの終了ステータスは、waitpidシステムコールまたは同等の関数によって返された値です。終了ステータスは0〜255の範囲ですが、以下で説明するように、シェルは125を超える値を特別に使用する場合があります。シェル組み込みコマンドおよび複合コマンドの終了ステータスもこの範囲に制限されます。特定の状況下では、シェルは特別な値を使用して特定の障害モードを示します。
だから、それはその範囲に制限されます、私は実際にあなたがそうであるのと同じくらい驚きます。
waitpid (2)
manページから:
WEXITSTATUS(status)
子の終了ステータスを返します。これは、子がexit(3)または_exit(2)の呼び出しで、またはmain()のreturnステートメントの引数として指定したステータス引数の最下位8ビットで構成されます。このマクロは、WIFEXITEDがtrueを返した場合にのみ使用してください。