120

perror("...")マニュアルページといくつかのコードを読んでも、 - またはより良いのは、いつ使用すべきか -またはの違いを理解するのに実際には役立ちませんでしたfprintf(stderr, "...")

4

5 に答える 5

130

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

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

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

于 2012-08-24T02:07:20.567 に答える
49

彼らはかなり異なることをします。

に対応するperror()メッセージを印刷するために使用します。、またはその他のストリームに何かを出力するために使用します。非常に特殊な印刷機能です。stderrerrnofprintf()stderrperror()

perror(str);

と同等です

if (str)
    fprintf(stderr, "%s: %s\n", str, strerror(errno));
else
    fprintf(stderr, "%s\n", strerror(errno));
于 2012-08-24T02:35:08.370 に答える
15

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

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

関連する:

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

于 2012-08-24T02:07:59.590 に答える
-3

perror 関数は、実行呼び出しを実行するのにより多くの時間がかかります fprintf 呼び出しは api からカーネル空間に移動しますが、ユーザー空間からカーネル空間に移動します

于 2015-02-04T07:53:57.857 に答える