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


10

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

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

int main()
    {
        return -1;
    }

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

echo $?
255

回答:


24

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

編集して追加:

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

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

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


素敵な編集。追加情報をお寄せいただきありがとうございます。
George M

7

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

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

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

waitpid (2)manページから:

WEXITSTATUS(status)

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.