注errno
のみ使用することがあることを悪い考え:標準ライブラリ関数は、自分の仕事をするために、他の標準ライブラリ関数を呼び出します。呼び出された関数の1つが失敗すると、エラーの原因を示すようにerrno
が設定され、ライブラリ関数は、が他のメカニズムにフォールバックできるようにプログラムされている場合でも引き続き成功する可能性があります。
はmalloc(3)
を考えてみましょう - それはメモリを割り当てるために戻ってsbrk(2)
に秋に失敗した場合、最初の試みとしてmmap(.., MAP_PRIVATE|MAP_ANONYMOUS)
、およびしようとするようにプログラムすることがあります。または、execvp(3)
を考えてみてください。プログラムを実行しようとすると、十数個のディレクトリを調べることができ、その多くが最初に失敗する可能性があります。 「ローカル障害」は、より大きな障害を意味しません。関数が呼び出されたときに返される前に、errno
が0
に戻されません。これは正当ではありませんが、以前から残っていない値が残っている可能性があります。
errno
の値をチェックして、エラーが発生したかどうかを確認することはできません。 errno
が含まれている標準ライブラリ関数もエラーを返した場合は意味がありますを返します。 (このようなread(2)
からgetcwd(3)
または-1
からNULL
、またはprintf(3)
から「負の値」など。)
しかし、標準ライブラリ関数が失敗しない場合には、errno
は、彼らが失敗した理由を発見する唯一の方法です。他のライブラリ関数(標準ライブラリでは提供されていない)が失敗すると、errno
を使用するか、類似しているが異なるツールを提供する可能性があります(例えばERR_print_errors(3ssl)
またはgai_strerror(3)
を参照してください)。全詳細。
あなたはあなたが好きな答えを得るまでこの質問を続けていますか? –
[[ユーザー定義のエラーコードでerrnoを使用する]の可能な複製?](http://stackoverflow.com/questions/6438133/using-errno-with-user-defined-error-codes) –
@David:いいえ、終わった、満足したsarnoldの答えで... – rsjethani