私はC++プログラミングの初心者であり、非常に基本的な質問があります。 C++プログラムで-1
を返し、終了ステータスを確認すると、255
が返されることに気づきました。何故ですか?
コードは最も基本的です:
int main()
{
return -1;
}
次に、コンパイルされたコードを実行した後:
echo $?
255
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を超える値を特別に使用する場合があります。 Shellビルトインおよび複合コマンドの終了ステータスもこの範囲に制限されます。特定の状況下では、シェルは特別な値を使用して特定の障害モードを示します。
ですから、それはその範囲に制限されます。実際、私はあなたと同じくらい驚いています。
waitpid (2)
のmanページから:
WEXITSTATUS(status)
子の終了ステータスを返します。これは、子がexit(3)または_exit(2)の呼び出しで、またはmain()のreturnステートメントの引数として指定したステータス引数の最下位8ビットで構成されます。このマクロは、WIFEXITEDがtrueを返した場合にのみ使用してください。