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は何とかこの動作を奨励しましたが、再び復元されています。

おすすめ記事