web-dev-qa-db-ja.com

-1を返すときにエラー255が発生するのはなぜですか

私はC++プログラミングの初心者であり、非常に基本的な質問があります。 C++プログラムで-1を返し、終了ステータスを確認すると、255が返されることに気づきました。何故ですか?

コードは最も基本的です:

int main()
    {
        return -1;
    }

次に、コンパイルされたコードを実行した後:

echo $?
255
10
Eugene S

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

追加して編集:

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

UNIX/POSIXのfork/exec/waitモデルは、非常に古く、最も深く埋め込まれた機能の1つです。今日新しいオペレーティングシステムを設計している場合は、何か別のことを行うかもしれません(少なくとも64ビットを使用する:-))。

一方、実際に言えば、255を超える終了コードを持つことは本当に便利ですか?疑わしい。より強力なものが本当に必要な場合は、数値範囲の広い終了コードではなく、「終了文字列」に切り替えることをお勧めします。

22
MadScientist

終了ステータスbash manページから引用するには

実行されたコマンドの終了ステータスは、waitpidシステムコールまたは同等の関数によって返された値です。終了ステータスは0〜255ですが、以下で説明するように、シェルは125を超える値を特別に使用する場合があります。 Shellビルトインおよび複合コマンドの終了ステータスもこの範囲に制限されます。特定の状況下では、シェルは特別な値を使用して特定の障害モードを示します。

ですから、それはその範囲に制限されます。実際、私はあなたと同じくらい驚いています。

waitpid (2)のmanページから:

WEXITSTATUS(status)

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

7
utopiabound