web-dev-qa-db-ja.com

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

「異常終了」を表すために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とのインターフェースが困難になります。

このアンチパターンはどこから来たのですか?ある状況で有効ですか?

23
user222973

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

スクリプトまたはプログラムに複数の可能な終了ステータス(単純な例についてはgrepを参照)がある場合、通常、意味のあるものが最も小さい番号に割り当てられ、可能な最大の終了コードを使用に適したものにするので、これは便利です。 「不明なエラー」または「中止」。意味のあるステータス値と競合することはほとんどありません。

22
Todd Knarr