STRERROR(3)

NAME
perror, strerror, strerror_l, strerror_r, sys_errlist, sys_nerr - system error messages

LIBRARY
libc

SYNOPSIS
#include <stdio.h>
void
perror(const char *string);
#include <errno.h>
extern const char * const sys_errlist[];
extern const int sys_nerr;
#include <string.h>
char *
strerror(int errnum);
int
strerror_r(int errnum, char *strerrbuf, size_t buflen);
char *
strerror_l(int errnum, locale_t loc);

DESCRIPTION
The strerror(), strerror_l(), strerror_r(), and perror() functions look up the language-dependent error message string corresponding to an error number.

The strerror() function accepts an error number argument errnum and returns a pointer to the corresponding message string. The application should not attempt to modify the returned string, it may be shared, or read only.

The strerror_r() function renders the same result into strerrbuf for a maximum of buflen characters (including terminator) and returns 0 upon success.

The strerror_l() function is like strerror() but provides in loc the locale to be used to obtain the language for the message, rather than using the application's current locale.

The perror() function finds the error message corresponding to the current value of the global variable errno (intro(2)) and writes it, followed by a newline, to the standard error file descriptor. If the argument string is non-NULL and does not point to the nul character, this string is prepended to the message string and separated from it by a colon and space (“: ”); otherwise, only the error message string is printed. Note that in most cases the err(3) and warn(3) family of functions is preferable to perror(); they are more flexible and also print the program name.

If the error number is not recognized, these functions return an error message string containing “Unknown error: ” followed by the error number in decimal. To warn about this, strerror() and strerror_l() set errno to EINVAL, and strerror_r() returns EINVAL. In other cases, except where noted below, errno is not altered, so applications should set it to a known value (usually zero) before calling either strerror() or strerror_l() if the resulting value in errno is to be tested for this condition. Error numbers recognized by this implementation fall in the range 0 < errnum < sys_nerr.

If insufficient storage is provided in strerrbuf (as specified in buflen) to contain the error string, strerror_r() returns ERANGE and strerrbuf will contain an error message that has been truncated and NUL terminated to fit the length specified by buflen. In extraordinary cases, it is possible that the internal buffer used by strerror() and strerror_l() may be too small for a translated message, in which case it will be truncated as indicated for strerror_r() and errno will be set to ERANGE.

The POSIX locale message strings can be accessed directly using the external array sys_errlist. The external value sys_nerr contains a count of the messages in sys_errlist. The use of these variables is deprecated; one of the strerror() family of functions should be used instead.

COMPATIBILITY
Programs that attempt to use the deprecated sys_errlist variable often fail to compile because they provide their own, inconsistent, declaration of it. Such programs should be updated to use strerror().

ERRORS
These functions may fail if:

[EINVAL]
    The error number was out of range.

[ERANGE]
    The string buffer supplied was not large enough to hold the complete error message.

SEE ALSO
intro(2), err(3), psignal(3), warn(3)

STANDARDS
The perror() and strerror() functions conform to isoC-99. The strerror_r() function conforms to p1003.1-2001. The strerror_l() function conforms to p1003.1-2008.

HISTORY
The perror() function first appeared in AT&T UNIX. The strerror() function first appeared in 4.3BSD Reno. The strerror_r() function first appeared in NetBSD 4.0. The strerror_l() function was first released in NetBSD 7.0.

BUGS
The strerror() function may return its result in a static buffer which will be overwritten by subsequent calls. For portable use, this must be assumed to be a subsequent call from the current, or any other, thread in the process. This implementation limits the issue to calls from the current thread. The strerror_l() function has a similar restriction, but even in other implementations, is required to use thread local storage, so only other calls from the calling thread can overwrite the result. Both strerror() and strerror_l() use the same thread local storage; a call to either will destroy the result from an earlier call by the same thread of either of them.