-1が返されたときにエラー255が発生する理由

-1が返されたときにエラー255が発生する理由

私はC ++プログラミングに初めて触れましたが、非常に基本的な質問があります。-1C ++プログラムに戻って終了ステータスを確認すると、255なぜこの現象が発生しますか?

コードは基本です。

int main()
    {
        return -1;
    }

その後、コンパイルされたコードを実行します。

echo $?
255

答え1

UNIX / POSIXでは、プログラムの終了コードは符号なし8ビット値として定義されているためです。 -1を符号なし8ビットに変換すると255になります。

以下を追加するように編集されました。

詳細を提供するには、UNIX の wait*() システムコールファミリは、プロセス結果を単一の 32 ビット整数にエンコードします。この結果の32ビットは、プロセスがコアをダンプし、信号(およびどの信号)で終了したかなどの情報を提供するためにさらに細分化されています。これらの32ビットのうち8ビットのみがプロセスの終了コード用に予約されており、これは符号なし値として解釈されます。

UNIX/POSIXのfork/exec/waitモデルは、最も古くて深い機能の1つです。今日、新しいオペレーティングシステムを設計している場合は、おそらく他の作業を実行します(少なくとも64ビットを使用してください:-)。

一方、> 255終了コードは本当に役に立ちますか?私はそれを疑う。本当にもっと多くの機能が必要な場合は、より広い範囲の数値終了コードの代わりに「終了文字列」に切り替えることをお勧めします。

答え2

マニュアルbashページの引用終了ステータス

実行されたコマンドの終了ステータスは、waitpidシステムコールまたは同等の関数によって返される値です。終了状態の範囲は 0 ~ 255 ですが、シェルでは以下のように具体的に 125 より高い値を使用することもできます。シェル組み込みおよび複合コマンドの終了状態もこの範囲に制限されます。場合によっては、シェルは特定のエラーモードを示すために特別な値を使用します。

だからそれに限定されています。実は私もあなたほど驚きました。

waitpid (2)マニュアルページから:

WEXITSTATUS(status)

子プロセスの終了ステータスを返します。これは、exit(3)または_exit(2)を呼び出すときに子プロセスによって指定される、またはmain()のreturnステートメントの引数として指定される状態パラメータの最下位8ビットで構成されます。このマクロは、WIFEXITEDがtrueを返す場合にのみ使用してください。

関連情報