STRERROR(3)

名称
perror, strerror, strerror_r, sys_errlist, sys_nerr - システムのエラーメッセージ

ライブラリ
libc

書式
<stdio.h> void perror(const char *string) extern const char * const sys_errlist[]; extern const int sys_nerr; <string.h> char * strerror(int errnum) int strerror_r(int errnum, char * strerrbuf, size_t buflen)

解説
strerror(), strerror_r() および perror() 関数は、エラー番号に対応するエラーメッセージ文字列を探し出します。

strerror() 関数は、エラー番号の引数 errnum を受け取って、それに対応するメッセージ文字列へのポインタを返します。

strerror_r() 関数は、 同じ結果を 最大 buflen 文字数の strerrbuf に直し、 成功した場合は 0 を返します。

perror() 関数は、大域変数 errno (intro(2)) の現在の値に対応するエラーメッセージを探して、 それに改行をつけて標準エラーファイル記述子に書込みます。引数 string が ヌル 以外であり、ヌル文字を指さない場合は、 この文字列はメッセージ文字列の前にコロンとスペース (‘: ’); で区切って追加されます。 それ以外の場合は、エラーメッセージ文字列のみが印字されます。

errnum がエラー番号として認識できない場合は、 strerror() は、 “Unknown error: ” のエラーメッセージ文字列の後に、 10 進数のエラー番号を返し、 errno に EINVAL をセットします。 strerror_r() は、 strerrbuf を変更せずに EINVAL を返します。 エラー番号が 0 <= errnum < sys_nerr 内の実装では、認識できません。

エラー文字列を含む ( buflen で指定されているより) strerrbuf が不十分な領域の場合、 strerror_r() は ERANGE を返し、 strerrbuf には、 buflen で指定された ヌル文字で終了する長さの 切り捨てたエラーメッセージが入ります。

メッセージ文字列には、外部配列 sys_errlist を使って直接アクセスすることができます。外部値 sys_nerr には sys_errlist の中にあるメッセージのカウントが入っています。 これらの変数を使用することには賛成できません。代わりに、 strerror() または strerror_r() を使った方がよいでしょう。

関連項目
intro(2), psignal(3)

歴史
strerror() および perror() 関数は、 4.4BSD ではじめて登場しました。 strerror_r() 関数は、 Wes Peters <wes@freebsd.org>. によって FreeBSD 4.4 で実装されました。

バグ
認識できないエラー番号に対しては、 strerror() 関数はその結果を静的バッファに返し、 それは以降の呼び出しによって上書きされる可能性があります。

sys_errlist 変数を使用している好ましくないプログラムは、 その変数を一貫性なく宣言するために失敗することがしばしばあります。