perror("...")
マニュアルページといくつかのコードを読んでも、 - またはより良いのは、いつ使用すべきか -またはの違いを理解するのに実際には役立ちませんでしたfprintf(stderr, "...")
。
5 に答える
を呼び出すperror
と、解釈された の値が得られますerrno
。これは、POSIX syscalls によって書き込まれるスレッド ローカル エラー値です (つまり、すべてのスレッドが に対して独自の値を持っていますerrno
)。たとえば、 を呼び出してopen()
エラーが発生した (つまり、 が返された) 場合、その後すぐに を-1
呼び出して、実際のエラーの内容を確認できます。perror
その間に他のシステムコールを呼び出すと、値がerrno
上書きperror
され、以前のシステムコールによってエラーが生成された場合、問題の診断に呼び出しが役に立たないことに注意してください。
fprintf(stderr, ...)
一方、独自のカスタム エラー メッセージを出力するために使用できます。に出力することによりstderr
、エラー報告の出力が に出力されるはずの「通常の」出力と混在することを回避できますstdout
。
を呼び出すとの出力文字列値が生成されるため、fprintf(stderr, "%s\n", strerror(errno))
は に似ていることに注意してください。その後、 を介して他のカスタム エラー メッセージと組み合わせることができます。perror(NULL)
strerror(errno)
errno
fprintf
彼らはかなり異なることをします。
に対応するperror()
メッセージを印刷するために使用します。、またはその他のストリームに何かを出力するために使用します。非常に特殊な印刷機能です。stderr
errno
fprintf()
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 関数は、実行呼び出しを実行するのにより多くの時間がかかります fprintf 呼び出しは api からカーネル空間に移動しますが、ユーザー空間からカーネル空間に移動します