GNU/Linux >> Linux の 問題 >  >> Linux

Linux – Linuxの終了コードの最小値と最大値?

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

  1. バイナリ実行可能ファイルから返された終了コード(例:C
    プログラム)。
  2. bashスクリプトから返された終了コード(exitを呼び出す場合) 。
  3. 関数から返された終了コード(returnを呼び出す場合) )。
    これはの間にあると思います および255

承認された回答:

_exit()に渡された番号 / exit_group() システムコール(終了コードと呼ばれることもあります 終了ステータスとのあいまいさを回避するため これは、終了コードまたはシグナル番号のいずれかのエンコーディングと、プロセスが強制終了されたか正常に終了したかに応じた追加情報も参照しています)は、タイプintです。 、LinuxのようなUnixライクなシステムでは、通常、値が-2147483648(-2)から2147483647(2-1)の32ビット整数です。

ただし、すべてのシステムで、親プロセス(または子サブリーパーまたはinit 親が死亡した場合)はwait()を使用します 、waitpid()wait3()wait4() システムコールで取得しますが、使用できるのは下位8ビットのみです(値0〜255(2-1))。

waitid()を使用する場合 API(またはSIGCHLDのシグナルハンドラー)、ほとんどのシステム(およびPOSIXは、2016年版の標準でより明確に要求されるようになりました(_exit()を参照) 仕様))、完全な番号が利用可能です(si_status 返された構造のフィールド)。 Linuxの場合はまだそうではありませんが、waitid()を使用して数値を8ビットに切り捨てます。 APIですが、将来変更される可能性があります。

多くのシェルは$?で128を超える値を使用するため、通常は0(通常は成功を意味する)から125までの値のみを使用する必要があります。 終了ステータスの表現 強制終了されるプロセスの信号番号と、特別な条件の場合は126および127をエンコードします。

exit()で126〜255を使用することをお勧めします シェルの$?の場合と同じことを意味します (スクリプトがret=$?; ...; exit "$ret"を実行する場合など )。 0-> 255以外の値を使用することは、通常は役に立ちません。通常、これは、親がwaitid()を使用することがわかっている場合にのみ行います。 切り捨てられないシステムでのAPIで、32ビット範囲の値が必要になる場合があります。 exit(2048)を実行する場合は注意してください たとえば、これは、従来のwait*()を使用する親によって成功と見なされます。 API。

詳細情報:

  • プロセスが終了したときのデフォルトの終了コード?

そのQ&Aは、他のほとんどの質問に答え、終了ステータスの意味を明確にする必要があります。 。さらにいくつか追加します:

プロセスを強制終了するか、_exit()を呼び出さない限り、プロセスを終了することはできません。 / exit_group() システムコール。 main()から戻ったとき Cで 、libcは、そのシステムコールを戻り値で呼び出します。

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

関連:Linux – Ubuntu APTを再利用する方法は?

少なくとも次の場合はそうです:

$ 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)                           = ?

値がexitに渡された場合、POSIXは動作を未定義のままにします 特別なビルトインは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 exit_group()を呼び出す代わりに、257から256+max_signal_numberまでの出口値に対して最も奇妙な動作をします。 、対応する信号で自殺します¹。

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

    それ以外の場合は、bashのように数値を切り捨てます。 / mksh


Linux
  1. Linuxのwatchコマンドでコマンドとタスクを監視する

  2. Linux Sedコマンド:使用法と例

  3. Linuxでエイリアスを作成してエイリアスコマンドを使用する方法

  1. iノードとLinuxファイルシステム

  2. LinuxでPingコマンドをインストールして使用する方法

  3. Linux の Bash 終了コードとは

  1. OSとLinuxのバージョンを確認する方法

  2. Linuxで最大のファイルとディレクトリを探す

  3. LinuxでL1、L2、L3キャッシュ、RAMのサイズを知る方法はありますか?