NAME

strerror, strerrorname_np, strerrordesc_np, strerror_r, strerror_l - 오류 번호를 설명하는 문자열 반환

SYNOPSIS

#include <string.h>

char *strerror(int errnum);
const char *strerrorname_np(int errnum);
const char *strerrordesc_np(int errnum);

int strerror_r(int errnum, char *buf, size_t buflen);
               /* XSI 준수 */

char *strerror_r(int errnum, char *buf, size_t buflen);
               /* GNU 전용 */

char *strerror_l(int errnum, locale_t locale);

glibc 기능 확인 매크로 요건 (feature_test_macros(7) 참고):

strerrorname_np(), strerrordesc_np():
_GNU_SOURCE
strerror_r():
다음 경우에 XSI 준수 버전 제공:
(_POSIX_C_SOURCE >= 200112L) && ! _GNU_SOURCE
아니면 GNU 전용 버전 제공.

DESCRIPTION

strerror() 함수는 errnum 인자로 준 오류 코드를 설명하는 문자열 포인터를 반환하며, 현재 로캘의 LC_MESSAGES 요소로 적절한 언어를 선택할 수도 있다. (예를 들어 errnumEINVAL이면 반환되는 설명이 "Invalid argument"이다.) 응용에서 그 문자열을 변경해선 안 되며, 후속 strerror() 내지 strerror_l() 호출에서 그 문자열을 변경할 수 있다. perror(3)를 포함한 다른 라이브러리 함수들은 이 문자열을 변경하지 않는다.

strerrordesc_np() 함수는 strerror()과 마찬가지로 errnum 인자로 준 오류 코드를 설명하는 문자열 포인터를 반환하는데, 반환되는 문자열이 현재 로캘에 따라 번역돼 있지 않다는 점이 다르다.

strerrorname_np() 함수는 errnum 인자로 준 오류 코드의 이름을 담은 문자열 포인터를 반환한다. 예를 들어 EPERM을 인자로 주면 문자열 "EPERM"의 포인터를 반환한다.

strerror_r()

strerror_r() 함수는 strerror()와 비슷하되 스레드에 안전하다. 이 함수는 두 가지 버전이 있다. POSIX.1-2001에 명세된 XSI 준수 버전(glibc 2.3.4부터 사용 가능하지만 glibc 2.13까지는 XSI 준수 아님)과 GNU 전용 버전(glibc 2.0부터 사용 가능)이다. SYNOPSIS에 있는 기능 확인 매크로 구성으로는 XSI 준수 버전이 제공되고, 아니면 GNU 전용 버전이 제공된다. 명시적으로 어떤 기능 확인 매크로도 정의하지 않으면 (glibc 2.4부터) 기본적으로 _POSIX_C_SOURCE가 200112L 값으로 정의되고, 그래서 strerror_r()의 XSI 준수 버전이 기본적으로 제공된다.

이식 가능한 응용에서는 XSI 준수 strerror_r()가 바람직하다. 사용자가 제공하는 buflen 길이의 버퍼 buf로 오류 문자열을 반환한다.

GNU 전용 strerror_r()은 오류 메시지를 담은 문자열의 포인터를 반환한다. 함수에서 buf에 저장한 문자열의 포인터일 수도 있고 (buf를 쓰지 않는 경우에는) 어떤 (불변) 정적 문자열의 포인터일 수도 있다. 함수에서 buf에 문자열을 저장하는 경우에는 최대 buflen 바이트가 저장된다. (buflen이 너무 작고 errnum가 알 수 없는 값이면 문자열이 잘려 있을 수 있다.) 그 문자열에는 항상 종료용 널 바이트('\0')가 들어간다.

strerror_l()

strerror_l()strerror()와 비슷하되 errnumlocale에 지정한 로캘의 로캘 의존적 오류 메시지로 연결한다. locale이 특수 로캘 객체 LC_GLOBAL_LOCALE이거나 유효한 로캘 객체 핸들이 아닌 경우 strerror_l()의 동작 방식은 규정돼 있지 않다.

RETURN VALUE

strerror(), strerror_l(), GNU 전용 strerror_r() 함수는 적절한 오류 설명 문자열을 반환한다. 알 수 없는 오류 번호면 "Unknown error nnn" 메시지를 반환한다.

성공 시 strerrname_np()strerrordesc_np()는 적절한 오류 설명 문자열을 반환한다. errnum이 유효하지 않은 오류 번호이면 NULL을 반환한다.

XSI 준수 strerror_r() 함수는 성공 시 0을 반환한다. 오류 시 (양수) 오류 번호를 반환하거나 (glibc 2.13부터), -1을 반환하고 오류를 나타내도록 errno를 설정한다 (glibc 버전 2.13 전).

POSIX.1-2001과 POSIX.1-2008에서는 strerror()strerror_l() 호출 성공 시 errno를 바꾸지 않아야 한다고 요구하고 있으며, 오류를 나타내기 위한 함수 반환 값이 없기 때문에 응용에서 호출 전에 errno를 0으로 설정하고 호출 후에 errno를 확인해야 한다고 언급한다.

ERRORS

EINVAL
errnum 값이 유효한 오류 번호가 아니다.
ERANGE
제공 저장 공간이 오류 설명 문자열을 담기에 충분하지 않다.

VERSIONS

glibc 2.6에서 strerror_l() 함수가 처음 등장했다.

glibc 2.32에서 strerrorname_np()strerrordesc_np() 함수가 처음 등장했다.

ATTRIBUTES

이 절에서 사용하는 용어들에 대한 설명은 attributes(7)를 보라.

인터페이스 속성
strerror() 스레드 안전성 MT-Unsafe race:strerror
strerrorname_np(), strerrordesc_np() 스레드 안전성 MT-Safe
strerror_r(), strerror_l() 스레드 안전성 MT-Safe

CONFORMING TO

strerror()는 POSIX.1-2001, POSIX.1-2008, C89, C99에 명세돼 있다. strerror_r()은 POSIX.1-2001, POSIX.1-2008에 명세돼 있다.

strerror_l()은 POSIX.1-2008에 명세돼 있다.

GNU 전용 함수 strerror_r(), strerrorname_np(), strerrordesc_np()는 비표준 확장이다.

POSIX.1-2001에서는 strerror() 호출에서 오류를 만난 경우 errno를 설정하는 건 허용하지만 오류 시에 함수 결과로 어떤 값을 반환해야 하는지는 명시하지 않고 있다. 어떤 시스템에서는 알 수 없는 오류 번호인 경우 NULL을 반환한다. 다른 시스템에서는 알 수 없는 오류 번호인 경우 strerror()가 "Error nnn occurred" 비슷한 문자열을 반환하고 errnoEINVAL로 설정한다. C99와 POSIX.1-2008에서는 반환 값이 NULL이 아니어야 한다고 요구한다.

NOTES

GNU C 라이브러리에서는 strerror()에 1024개 문자로 된 버퍼를 쓴다. 이 크기면 strerror_r() 호출 시 ERANGE 오류를 피하기에 충분할 것이다.

strerrorname_np()strerrordesc_np()는 스레드 안전이고 비동기 시그널 안전이다.

SEE ALSO

err(3), errno(3), error(3), perror(3), strsignal(3), locale(7)


2021-03-22