2011-06-24 6 views
2

Cでのエラー処理に関して以前から多くの質問がありましたが、これは特にerrnoに関するものです。エラーを検出するのにerrno/perrorの方法を使用しますか?

実行時にエラーを正常に処理するためにerrno/perror機能を使用する必要があるかどうかを質問したいと思います。MSVCがそれを使用し、Win32 APIも重く使用しているので、これを求めています。 linux api'Today gccとMSVCの両方は、errno/perrorをマルチスレッド環境で安全に使用できると言っています。あなたの意見は何ですか?

ありがとうございました。

+3

あなたはあなたが好きな答えを得るまでこの質問を続けていますか? –

+0

[[ユーザー定義のエラーコードでerrnoを使用する]の可能な複製?](http://stackoverflow.com/questions/6438133/using-errno-with-user-defined-error-codes) –

+0

@David:いいえ、終わった、満足したsarnoldの答えで... – rsjethani

答えて

6

errnoのみ使用することがあることを悪い考え:標準ライブラリ関数は、自分の仕事をするために、他の標準ライブラリ関数を呼び出します。呼び出された関数の1つが失敗すると、エラーの原因を示すようにerrnoが設定され、ライブラリ関数は、が他のメカニズムにフォールバックできるようにプログラムされている場合でも引き続き成功する可能性があります。

malloc(3)を考えてみましょう - それはメモリを割り当てるために戻ってsbrk(2)に秋に失敗した場合、最初の試みとしてmmap(.., MAP_PRIVATE|MAP_ANONYMOUS)、およびしようとするようにプログラムすることがあります。または、execvp(3)を考えてみてください。プログラムを実行しようとすると、十数個のディレクトリを調べることができ、その多くが最初に失敗する可能性があります。 「ローカル障害」は、より大きな障害を意味しません。関数が呼び出されたときに返される前に、errno0に戻されません。これは正当ではありませんが、以前から残っていない値が残っている可能性があります。

errnoの値をチェックして、エラーが発生したかどうかを確認することはできません。 errnoが含まれている標準ライブラリ関数もエラーを返した場合は意味がありますを返します。 (このようなread(2)からgetcwd(3)または-1からNULL、またはprintf(3)から「負の値」など。)

しかし、標準ライブラリ関数が失敗しない場合には、errnoは、彼らが失敗した理由を発見する唯一の方法です。他のライブラリ関数(標準ライブラリでは提供されていない)が失敗すると、errnoを使用するか、類似しているが異なるツールを提供する可能性があります(例えばERR_print_errors(3ssl)またはgai_strerror(3)を参照してください)。全詳細。

+0

次に、_standardライブラリ関数_&_内部標準ライブラリ関数_... **エラー**を検出する代替手段は何ですか?それは非常に有用でした –

+1

@ CAD_coding、悲しいことに悲しいことに、エラーのための標準ライブラリ関数を調べることは控えています - 使用するすべての関数のマンページを読んで、 'RETURN VALUE'セクションを見てくださいエラーが何を返すかを発見します(時には '0'、場合によっては' -1'、時には 'NULL')、そしてエラーをチェックするコードを書いてください。エラーリターンの場合にのみ、 'errno'は_meaning_を持ちます。 – sarnold

+0

あなたの助けをたくさんありがとう:) –

1

本当に "should"の質問かどうかわかりませんが、Cでプログラミングしていて、低レベルのC/posix APIを使用している場合、実際には他のオプションはありません。もちろん、これがあなたの文体感覚に害を及ぼすならば、それを包むことができますが、それはどのように動作するのか(少なくともPOSIXが標準である限り)です。

0

Linuxでは、errnoは複数のスレッドやプロセスで読み書きすることは安全ですが、perror()では安全ではありません。再入場しない標準的な図書館です。

関連する問題