マニュアルページといくつかのコードを読むことは、perror("...")
またはfprintf(stderr, "...")
の違いを理解するのに本当に役立ちませんでした。
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
経由のメッセージ。
彼らはかなり違うことをします。
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));
perror(const char *s)
:指定した文字列に続いて、errno
の現在の値を説明する文字列を出力します。
stderr
:独自のエラーメッセージをパイプするために使用される出力ストリームです(デフォルトは端末です)。
関連:
char *strerror(int errnum)
:エラー番号を指定すると、関連するエラー文字列が返されます。
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」を課しています