_exit()
/ exit_group()
システムコールに渡される番号(終了ステータスとのあいまいさを避けるために終了コードと呼ばれることもあります。これは、プロセスが強制終了または正常終了したかどうかに応じて、終了コードまたはシグナル番号のエンコードと追加情報も参照します) )はtype int
であるため、LinuxなどのUnix系システムでは、通常、-2147483648(-2 31)から2147483647(2 31 -1)までの値を持つ32ビット整数です。
すべてのシステム、親プロセスに(または子subreaperまたはしかし、init
親が死亡した場合)は使用していますwait()
、waitpid()
、wait3()
、wait4()
それを取得するためのシステムコールを、それの下位8ビットのみが利用可能(値が0〜2(255ある8 - 1))。
waitid()
API(またはSIGCHLDのシグナルハンドラー)を使用する場合、ほとんどのシステムで(そしてPOSIXが標準の2016版(_exit()
仕様を参照)でより明確に要求されるように)、完全な番号が(si_status
返される構造のフィールドで)利用可能です)。Linuxではまだそうではありませんが、waitid()
APIで数値が8ビットに切り捨てられますが、将来的には変更される可能性があります。
一般に、多くのシェル$?
は終了ステータスの表現で128を超える値を使用して強制終了されているプロセスのシグナル番号をエンコードし、特別な場合は126と127をエンコードするため、値0(一般的に成功を意味する)のみを使用する必要があります条件。
exit()
シェルの$?
場合と同じことを意味するために、126〜255を使用したい場合があります(スクリプトの場合などret=$?; ...; exit "$ret"
)。通常、0-> 255以外の値を使用することは役に立ちません。通常は、waitid()
切り捨てられないシステムで親がAPI を使用することがわかっていて、32ビット値の範囲が必要な場合にのみ、それを行います。あなたがしなければことに注意してくださいexit(2048)
例えば、それは伝統的な使用の両親によって成功と見られるwait*()
のAPIを。
詳細情報:
Q&Aが他の質問のほとんどに回答し、終了ステータスが何を意味するのかを明確にする必要があります。さらにいくつか追加します。
プロセスは、強制終了されるか_exit()
/ exit_group()
システムコールを呼び出さない限り終了できません。main()
in から戻るC
と、libcはそのシステムコールを戻り値で呼び出します。
ほとんどの言語には、exit()
そのシステムコールをラップする関数があり、一般にシステムコールに渡される値がある場合はその値が使用されます。(これらは一般にexit()
、stdioバッファーをフラッシュし、atexit()
フックを実行するCの関数によって行われるクリーンアップのようなことを行うことに注意してください...)
少なくとも以下の場合です。
$ 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) = ?
POSIXは、exit
特別な組み込みに渡される値が0-> 255の外にある場合、動作を未定義のままにします。
一部のシェルでは、次のような予期しない動作が発生します。
bash
(mksh
ただし、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で述べたように、ksh93
257から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
ます。
¹ただし、次のバージョンでは変更される可能性があります。の開発はksh93
AT&T以外のコミュニティの取り組みとして引き継がれたため、その振る舞いはPOSIXによって何らかの形で奨励されていても、元に戻されています
return
で、もちろん、シェルの組み込みを。