Linuxでは、終了コードの最小値と最大値は何ですか?

Linuxでは、終了コードの最小値と最大値は何ですか?

Linuxでは、次の終了コードの最小値と最大値は何ですか?

  1. バイナリ実行可能ファイル(Cプログラムなど)から返された終了コード。
  2. bashスクリプト(呼び出し時)から返された終了コードですexit
  3. 関数から返された終了コード(呼び出し時return)。0との間のどこかにいると思います255

答え1

_exit()/system 呼び出しに渡された番号exit_group()(時々呼び出される)終了コードあいまいさを避けるために終了ステータスまた、プロセスが終了しているか正常に終了したかに応じて、終了コードまたはシグナル番号と追加情報の種類を示します。intしたがって、LinuxなどのUnixファミリーシステムでは、通常は-の値を持つ32ビット整数です。 2147483648(-2 31 ) ~ 2147483647(2 31 -1) です。

ただし、すべてのシステムで親プロセス(または子ハーベスタまたはinit親プロセス)がそれを取得するためにwait()、、、、、waitpid()システムコールを使用している場合は、その下位8ビットのみを使用できます(値0〜255(2 8 - 1))wait3()。 )。wait4()

waitid()API(またはSIGCHLDのシグナルハンドラ)を使用する場合、ほとんどのシステム(およびPOSIXは現在、2016バージョンの標準でこれをより明示的に要求します。(望むより_exit()仕様))完全な数字を使用できます(si_status返された構造体のフィールドから)。 Linuxではそうではありません。 Linuxでもwaitid()APIを使用して数字を8桁に切り捨てますが、これは将来変更される可能性があります。

$?一般的に言えば、多くのシェルは表現に128を超える値を使用するため、0(通常は成功を示す)と125の間の値のみを使用することをお勧めします。終了ステータス終了したプロセスの信号番号をエンコードします(特別な場合は126と127)。

exit()シェルと同等のことを意味するために126〜255を使用できます$?(例:script ret=$?; ...; exit "$ret")。 0 -> 255以外の値を使用することは通常役に立ちません。通常、親エントリがwaitid()切り捨てられないシステムでAPIを使用し、32ビット範囲の値が必要な場合にのみこれを実行します。たとえば、exit(2048)既存のAPIを使用している親はこれを成功と見なしますwait*()

詳しくは以下をご覧ください。

このQ&Aで、他のほとんどの質問に答えて明確に説明できることを願っています。終了ステータス。さらに追加します。

プロセスが終了した場合、またはシステムコール_exit()/exit_group()呼び出しが発生しない限り、プロセスを終了することはできません。main()inから戻ると、Clibcは戻り値を使用してそのシステムコールを呼び出します。

ほとんどの言語にはこのシステムコールをラップする関数があり、exit()その値(存在する場合)は通常そのままシステムコールに渡されます。 (これらのタスクは通常、C関数によるクリーンアップexit()、stdioバッファフラッシュ、フックの実行など、より多くのタスクを実行しますatexit()。)

少なくともこの場合は次のようになります。

$ strace -e exit_group awk 'BEGIN{exit(1234)}'
exit_group(1234)                        = ?
$ strace -e exit_group mawk 'BEGIN{exit(1234)}'
exit_group(1234)                        = ?
$ strace -e exit_group busybox awk 'BEGIN{exit(1234)}'
exit_group(1234)                        = ?
$ echo | strace -e exit_group sed 'Q1234'
exit_group(1234)                        = ?
$ strace -e exit_group perl -e 'exit(1234)'
exit_group(1234)                        = ?
$ strace -e exit_group python -c 'exit(1234)'
exit_group(1234)                        = ?
$ strace -e exit_group expect -c 'exit 1234'
exit_group(1234)                        = ?
$ strace -e exit_group php -r 'exit(1234);'
exit_group(1234)                        = ?
$ strace -e exit_group zsh -c 'exit 1234'
exit_group(1234)

0-255以外の値を使用すると、時々苦情が表示されます。

$ echo 'm4exit(1234)' | strace -e exit_group m4
m4:stdin:1: exit status out of range: `1234'
exit_group(1)                           = ?

一部のシェルは負の値を使用すると文句を言います。

$ strace -e exit_group dash -c 'exit -1234'
dash: 1: exit: Illegal number: -1234
exit_group(2)                           = ?
$ strace -e exit_group yash -c 'exit -- -1234'
exit: `-1234' is not a valid integer
exit_group(2)                           = ?

exitPOSIXは、特別な組み込み関数に渡された値が0から255の範囲外の場合、未定義の動作を維持します。

これにより、一部のシェルで予期しない動作が表示されます。

  • bashmkshしかし、pdkshその基盤が何であるかではありません)値を8ビットに直接切り捨てます。

    $ strace -e exit_group bash -c 'exit 1234'
    exit_group(210)                         = ?
    

    したがって、これらのシェルで実際に0から255以外の値で終了するには、次の手順を実行する必要があります。

    exec zsh -c 'exit -- -12345'
    exec perl -e 'exit(-12345)'
    

    つまり、同じプロセスで別のコマンドを実行します。できる必要な値でシステムコールを呼び出します。

  • 他のQ&Aで述べたように、ksh93257から256 + max_signal_numberまでの終了値に対して最も奇妙な動作があります。を呼び出す代わりに、exit_group()その信号で自己終了します。

    $ ksh -c 'exit "$((256 + $(kill -l STOP)))"'
    zsh: suspended (signal)  ksh -c 'exit "$((256 + $(kill -l STOP)))"'
    

    bashそれ以外の場合は/などの数字が切り捨てられますmksh


ただし、これは次のバージョンで変更される可能性があります。開発はksh93AT&T外部コミュニティの取り組みの一部です。POSIXは何とかこの動作を奨励しましたが、再び復元されています。

答え2

最小値は0成功値と見なされます。他のすべては失敗です。最大値255とも呼ばれます-1

これらのルールは、スクリプトやその他の実行可能ファイル、およびシェル機能にも適用されます。

より大きい値はモジュロ256になります。

答え3

簡単に見えますが、マッソッサ。

C言語(およびそれ以降の他のほとんどの言語、直接または間接)では、fromの戻り値が戻り値と同じ引数を使用する呼び出しとmain同じでなければなりません。exitこれは整数(戻り値の種類は非常に具体的ですint)なので、原則として範囲は〜INT_MINですINT_MAX

しかし、POSIXステータス渡された最低 8 ビットのみ待機しているexit親プロセスで使用できます。「状態&0xFF」
したがって、実際には終了コードは、最も低い8ビットのみが設定された(まだ符号付き)整数です。

したがって、最小値は-128、最大値は127です。ちょっと待って、それは本当ではない。 0~255になります。

思いやり、もちろんそれほど簡単ではありません。実際にLinux(またはむしろbash)違うようにしてください。戻りコードの有効範囲は0〜255(つまり符号なし)です。

混乱を避け、安全を保つためには、次のことをお勧めします。考える戻りコードは署名されておらず、返されたすべての項目は署名されてwaitいないコードに変換されます。これはシェルに見えるものと一致します。最も高いビット(最も高いビットを含む)がクリアされるため、これは「バグ」ではありません。技術的には署名されていますが、実際の値は常に符号がないためです(符号ビットが設定されていないため)。また、終了コードを次のものと
比較する一般的な間違いを防ぐのに役立ちます。-1変な理由でプログラムが終了しても表示されないようです-1(まあ、理由を推測してください!)。

最後のポイントに関して関数が返す場合は、この関数がある場合は上記をmain参照してください。それ以外の場合、関数の戻り値の型が何であるかによって異なり、原則として次のようになります。何もない(含むvoid)。

答え4

  1. バイナリ実行可能ファイル(Cプログラムなど)から返された終了コード。
  2. bashスクリプトから返された終了コード(exitが呼び出されたとき)。

すべてのプロセス(バイナリ実行可能ファイル、シェルスクリプト、またはその他のプロセス)の終了コードの範囲は0から255です。より大きい値は別のプロセスに渡すことができますが、exit()状態の下位8ビットのみが使用されますwait()

  1. 関数から返された終了コードです(returnが呼び出されたとき)。この値は0から255の間だと思います。

AC関数は、ほぼすべての型を返すように宣言できます。戻り値の制限は、完全に型によって決まります。たとえば、返された関数の場合は-128〜127、signed char返された関数の場合はunsigned int0〜42億です。これには、a などの数値以外の型は含まれません。infdoublevoid *struct

関連情報