web-dev-qa-db-ja.com

いつperror( "...")およびfprintf(stderr、 "...")を使用すべきですか?

マニュアルページといくつかのコードを読むことは、perror("...")またはfprintf(stderr, "...")の違いを理解するのに本当に役立ちませんでした。

96
freeboy1015

perrorを呼び出すと、errnoの解釈値が得られます。これは、POSIX syscallsによって書き込まれたスレッド固有のエラー値です(つまり、すべてのスレッドがerrnoに対して独自の値を持っています)。たとえば、open()を呼び出してエラーが生成された場合(つまり、-1を返した場合)、すぐにperrorを呼び出して、実際のエラーを確認できます。だった。その間に他のsyscallを呼び出すと、errnoの値が上書きされ、perrorの呼び出しはエラーが生成された場合の問題の診断には使用されないことに注意してください以前のシステムコールによって。

他方のfprintf(stderr, ...)は、独自のカスタムエラーメッセージを印刷するために使用できます。 stderrに出力することにより、エラー報告出力がstdoutに送信されるはずの「通常の」出力と混同されることを回避できます。

fprintf(stderr, "%s\n", strerror(errno))の呼び出しはerrnoの印刷文字列値を生成するため、perror(NULL)strerror(errno)に似ていることに注意してください。その後、他のカスタムエラーと組み合わせることができます。 fprintf経由のメッセージ。

102
Jason

彼らはかなり違うことをします。

perror()を使用して、stderrに対応するerrnoにメッセージを出力します。 fprintf()を使用してanything to stderrまたはその他のストリームを出力します。 perror()は非常に特殊化された印刷関数です。

perror(str);

に等しい

if (str)
    fprintf(stderr, "%s: %s\n", str, strerror(errno));
else
    fprintf(stderr, "%s\n", strerror(errno));
38
freeboy1015

perror(const char *s):指定した文字列に続いて、errnoの現在の値を説明する文字列を出力します。

stderr:独自のエラーメッセージをパイプするために使用される出力ストリームです(デフォルトは端末です)。

関連:

char *strerror(int errnum):エラー番号を指定すると、関連するエラー文字列が返されます。

10
Adib

perror()は常にstderrに書き込みます。 strerr()は、fprintf()と一緒に使用され、stderrを含むすべての出力に書き込むことができますが、排他的ではありません。

fprintf(stdout, "Error: %s", strerror(errno));
fprintf(stderr, "Error: %s", strerror(errno)); // which is equivalent to perror("Error")

さらに、perrorは独自のテキスト形式「text:error description」を課しています

1
Sebastien