「異常終了」を表すためにexit(-1)
、_return -1
_または類似のものを使用することを推奨する、インターネット上の多くのレガシーソフトウェアと悪いチュートリアルで私は見ます。問題は、少なくともPOSIXでは、_-1
_はこれまでになく、有効なステータスコードではありません。 _man 3 exit
_は、exit()
が_status & 0377
_の値を親に返すことを示しています。つまり、_-1
_は_255
_になります。非POSIXシステムでは、移植性のために_EXIT_FAILURE
_が推奨されます。しかし、「-1は異常終了を意味する」と「EXIT_FAILUREは1以外の可能性がある」を組み合わせて見たことがなく、非POSIXシステムでも「-1」が従来のものであると明確に信じていることを示しています。
これを永続化する StackOverflow質問 の例を次に示します。ソフトウェア「unrealircd」も、プログラムを終了するためにexit(-1)
を使用するプログラムの例です。実際には、これによりsystemd
とのインターフェースが困難になります。
このアンチパターンはどこから来たのですか?ある状況で有効ですか?
ほとんどすべてのUnixコンピュータは整数に2の補数を使用し、2の補数では-1はワードサイズに関係なく常に「すべてのビット1」です。プログラムの終了ステータスのサイズに関係なく、可能な限り最大の終了コードが必要な場合は、-1を使用し、ライブラリにそれを切り捨てさせると便利です。
スクリプトまたはプログラムに複数の可能な終了ステータス(単純な例についてはgrep
を参照)がある場合、通常、意味のあるものが最も小さい番号に割り当てられ、可能な最大の終了コードを使用に適したものにするので、これは便利です。 「不明なエラー」または「中止」。意味のあるステータス値と競合することはほとんどありません。