-1を返すときにエラー255が発生するのはなぜですか
On 2月 17, 2021 by admin 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
から引用するには終了ステータス
のdiv>マニュアルページ実行されたコマンドの終了ステータスは、waitpidシステムコールまたは同等の関数によって返される値です。終了ステータスは0から255の間にありますが、以下で説明するように、シェルは125を超える値を特別に使用する場合があります。シェルビルトインおよび複合コマンドの終了ステータスもこの範囲に制限されます。特定の状況下では、シェルは特定の障害モードを示すために特別な値を使用します。
その範囲に制限されているので、実際にはあなたはそうです。
waitpid (2)
のマニュアルページから:
WEXITSTATUS(status)
子の終了ステータスを返します。これは、exit(3)または_exit(の呼び出しで子が指定したステータス引数の最下位8ビットで構成されます。 2)またはmain()のreturnステートメントの引数として。このマクロは、WIFEXITEDがtrueを返した場合にのみ使用する必要があります。
コメントを残す