「exit(-1)」はどこから来たのですか?


22

「異常終了」を表すためにを使用することを推奨するexit(-1)、インターネット上の多くのレガシーソフトウェアや悪いチュートリアルに見られreturn -1ます。問題は、少なくともPOSIXでは-1、有効なステータスコードではなく、有効なステータスコードです。man 3 exitはのexit()値をstatus & 0377親に返すことを示しています。つまり、に-1なり255ます。非POSIXシステムでEXIT_FAILUREは、移植性のために推奨されます。しかし、「-1は異常終了を意味する」と「EXIT_FAILUREは1以外の可能性があります」とは表示されません。

これを永続化するStackOverflowの質問の例を次に示します。ソフトウェア「unrealircd」も、プログラムのexit(-1)終了に使用するプログラムの例です。実際には、これにより、とのインターフェースが難しくなりますsystemd

このアンチパターンはどこから来たのですか?あるコンテキストで有効ですか?


1
「Unixライクなシステムは、0意味の成功の終了状態という強い大会があり、任意のゼロ以外の終了ステータスは失敗を表し...この規則は、かなりハードUnixシェルに配線されている...」(ゼロ以外の終了ステータスきれいな出口のために
gnat

@gnat libcマニュアルによると、終了ステータスは明示的に0〜255です。ある時点で負の値が有効であると述べている答えがあれば、それを受け入れますが、それは非常に疑わしいと思います。
user222973

1
@gnat "255"はに簡単に収まりunsigned charます。
user222973


1
@gnat「Java」のバイトは符号なし文字ではありませんchar。値の範囲が-128〜127であるため、aと同等です。さらに、質問の本文で「-1」が「255」に変換されると既に述べました。 。
user222973

回答:


20

ほとんどすべてのUnixコンピューターは整数に2の補数を使用し、2の補数では、ワードサイズに関係なく、-1は常に「すべてのビット1」です。プログラムの終了ステータスのサイズに関係なく、可能な限り最大の終了コードが必要な場合は、-1を使用してライブラリを切り捨てさせると便利です。

スクリプトまたはプログラムに複数の可能な終了ステータスがある場合(grep簡単な例を参照)、通常、意味のあるものが最小の番号に割り当てられ、最大の終了コードが「不明なエラー」または「意味のあるステータス値と競合する可能性は低いため、「中止」します。


一例としてのglibcを取り、その道具exit()としてstatus &= 0xff-1 & 0xff255 ではない「ワードサイズ」はありますか?もちろん、そうではありません。全体の目的は、0〜255の範囲に収まるようにすることだからです。とにかく、最後の文は意味がありません。UNIXシステムでは、ステータスコード128-255には特別な目的があります。
user222973

2
Bashの終了値(0-127、128 +は特別なBash値)とプログラムの終了値(0-255、pubs.opengroup.org / onlinepubs / 009695399 / functions / exit.htmlを参照)と混同しないでください。サイズについては、Cプログラマーが最初から複数のワードサイズ(元は12、16、および32ビット)を扱っているため、ワードサイズを考慮する必要のないイディオムを自動的に試行することに注意してください。Unixは20年前にPosixに先行して以来、常に8ビットの制限があったわけではないので、私たちが書いたので重要ではありません。
トッドKnarr
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.