FDF(2)
errno
errno => 마지막으로 발생한 에러의 숫자를 의미한다.
-
헤더파일
#include
-
설명
errno.h헤더파일은 `errno` 정수변수를 정의한다. errno 변수는 `시스템 콜`이나 `몇몇 라이브러리 함수`가 오류를 감지하면 설정된다.
-
errno
errno 변수의 값은 시스템콜(오류 시 -1 반환), 라이브러리 함수들(-1이나 NULL)의 반환값이 오류를 나타낼때만 중요하다. 오류가 아닌 함수들의 경우, `errno`를 변경하는게 허용된다. 이 errno변수는 절대로 시스템콜, 라이브러리 함수들에 의해서 0으로 설정되지 않는다.
시스템콜이나, 함수의 반환값이 -1이라는게 무조건 오류가 발생했다는 것을 의미하는게 아니다. 일부 시스템콜과 getpriority와 같은 라이브러리 함수는 성공하면 -1를 반환한다. 이런 케이스에서는 호출 전에 0으로 설정된 errno가 호출 이후에 errno가 0이 아닌 값으로 변경되었는지 확인해서 에러를 관리할 수 있다.
errno는 ISO C 표준에서는 명시적으로 선언되지 않고, 변경이 가능한 정수형 변수이다. errno는 변수일 수도 있고, macro일수도 있다. errno는 thread-local(한 쓰레드에서 실행되는 코드가 동일한 errno를 사용하는 것을 의미)이므로, 한 쓰레드에서의 errno가 다른 쓰레드에 영향을 주지 않는다.
-
에러 숫자, 에러명들
유효한 에러숫자는 모두 양수이다. <errno.h>헤더파일은 errno에서 보여지는 각각의 가능한 에러에 대해 이름을 정의해두었다. POSIX.1 에서 식별된 에러명은 모두 EAGAIN, EWOULDBLOCK을 제외하곤 구분가능한 값을 가져야만한다. (EAGAIN, EWOULDBLOCK은 같을수도 있음)
각각의 에러명에 상응한 에러숫자는 UNIX 시스템마다 다를 수 있다. 또, 리눅스 아키텍쳐마다 다를수도 있다. 따라서, 숫자 값들은 아래의 에러명 리스트의 일부로 포함되지 않는다. perror(3) 및 strerror(3) 함수를 사용하여 이러한 이름을 해당 텍스트 오류 메시지로 변환할 수 있다.
perror
perror
=> system error message를 인쇄한다.
-
사용
#include <stdio.h> void perror(const char *s); #include <errno.h> const char *const sys_errlist[]; int sys_nerr; int errno; /*명시적으로 정의되지 않습니다!.. 단순 예시임!*/
-
설명
perror함수는 시스템콜, 라이브러리 함수를 호출하면서 가장 마지막에 생긴 error로 standard error에 메세지를 생성한다.
시스템콜이 실패하면 -1을 리턴하면서 errno를 설정하게된다. 이 errno로 어떤 에러인지 구분할 수 있다. 대다수의 라이브러리 함수들도 이를 따른다. perror()함수는 이 error code를 사람이 읽을 수 있는 형태로 변환해준다.
주의해야하는 것은, 시스템콜이나 라이브러리 함수가 성공했을때는 이 errno가 정의되지 않는다는 것이다. 이 경우에도 errno를 변경할수도 있는데, 그 이유로는 이 라이브러리 함수가 사용한 내부 함수나 시스템콜이 실패했을수도 있기 때문이다. 따라서, 실패한 호출이 즉시 perror()호출에 사용되지 않는다면, 실패한 호출로 인해 발생한 errno는 반드시 저장되어야한다.
-
함수 작동
우선, char *s;(s != 0 && *s != '\0')일때, 콜론과 공백을 뒤에 출력하면서 인자 s가 출력된다. 일반적으로, 위의 문자열s에 오류가 발생한 함수의 이름을 넣어줘야한다. 그리고, 현재 errno의 값에 해당하는 에러메세지가 출력되고, 개행이 출력된다.
-
sys_errlist[]
global error list로써, errno에 의해 index된다. 개행없이 error메세지를 가져올 수 있다. 테이블에서 제공되는 가장 큰 메세지의 숫자는 sys_nerr-1이다. 이 리스트를 직접 접근할때는 주의해야하는데, 새로운 error value가 sys_errlist[]배열에 추가되어있지 않을수도 있기 때문이다.
이 sys_errlist[]를 사용하는 것은 최근에 권장하지 않으며, 대신에 strerror를 사용하는 것을 권장한다.
strerror
error number를 묘사하는 문자열을 반환한다.
-
프로토타입
#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-compliant */ char *strerror_r(int errnum, char *buf, size_t buflen0; /* GNU에서만 */ char *strerror_l(int errnu, locale_t locale)) Feature Test Macro Requirements for glibc (see feature_test_macros(7)): strerrorname_np(), strerrordesc_np(): _GNU_SOURCE strerror_r(): The XSI-compliant version is provided if: (_POSIX_C_SOURCE >= 200112L) && ! _GNU_SOURCE Otherwise, the GNU-specific version is provided.
-
설명
strerror()함수는 인자로 전달된 errnum에 해당하는 error code를 표현하는 문자열 포인터를 리턴한다. 이때 이 문자열은 현재 locale의 LC_MESSAGES를 사용해 적절한 언어를 선택한다. 이 에러 문자열은 프로그램에 의해 수정되지 않지만, 뒤의 strerror()나, strerror_1()함수에 의해 수정될 수 있다. 다른 라이브러리 함수로 perror같은 경우에도 이 문자열을 수정한다.
strerror()함수처럼, strerrordesc_np()함수는 인자로 전달되니 errnum에 따라 error code를 표현하는 문자열 포인터를 리턴하나, locale에 따라 번역되지 않는다는 차이점이 있다. strerrorname_np()함수는 errnum에 해당하는 error code의 이름을 담은 포인터를 리턴한다. 예를 들어, 만약에 주어진 인자가 EPERM이면, 이 함수는 EPERM이라는 문자열 포인터를 리턴한다.
-
strerror_r()
The strerror_r() function is similar to strerror(), but is thread safe. strerror_r()함수는 strerror()함수와 같은데, thread-safe이다. thread-safe란, 함수, 변수, 객체가 여러 스레드로부터 동시에 접그닝 이루어져도 프로그램 실행에 문제가 없음을 의미한다. 이는 하나의 함수가 한 스레드에서 호출되어 실행 중일 때, 다른 스레드가 그 함수를 호출해 동시에 실행되어도 각 스레드에서 함수 실행결과가 올바로 나오는 것을 의미한다. This function is available in two versions: 이 함수는 2가지 버전이 존재한다. 1. XSI-compliant version specified in POSIX.1-2001 (available since glibc 2.3.4, but not POSIX-compliant until glibc 2.13) 2. GNU-specific version (available since glibc 2.0). XSI-compliant 버전의 경우, 위의 프로토타입에서 보여지는 test macros setting과 같이 제공된다. 아니면 GNU-specific 버전이 제공된다. 만약 아무런 test macros가 명시적으로 정의되지 않는다면, _POSIX_C_SOURCE가 기본적으로 200112L로 정의되어 XSI-compliant 버전의 strerror_r이 제공된다.
-
XSI-compliant 특징
XSI-compliant 버전의 strerror_r()은 휴대용 기기에서 선호된다. 사용자가 제공한 버퍼에 error string을 반환한다.
-
GNU-specific 특징
GNU-specific strerror_r()함수는 에러메세지를 포함한 문자열을 반환한다.
이 문자열 포인터의 경우, 함수가 버퍼에 저장하는 문자열의 포인터일수도 있고, 아니면 버퍼가 사용되지 않은 경우에 일부 정적 문자열에 대한 포인터일 수 있다.
문자열에 끝에는 항상 널문자가 포함되어있다.
-
-
strerror_l()
strerror_l()은 strerror()와 비슷하지만 errnum을 locale로 지정된 locale의 locale 종속 오류 메시지에 매핑한다. 만약 locale이 LC_GLOBAL_LOCALE과 같은 특수한 locale객체이거나, 유효한 locale객체 핸들이 아닌 경우에는 행동이 비정의된다.
-
반환값
strerror(), strerror_l(), GNU-specific strerror_r()은 error num에 맞는 적절한 문자열을 반환한다. error number가 불분명하면 `Unknown error nnn`문자열을 반환한다.
On success, strerrorname_np() and strerrordesc_np() return the appropriate error description string. 성공하면 sterrorname_np()와 strerrordesc_np()는 적절한 에러 표현 메세지를 리턴한다. errnum이 유효하지 않은 숫자이면 NULL포인터를 반환한다.
The XSI-compliant strerror_r() function returns 0 on success. XSI-compliant strerror_r*()함수는 성공하면 0을 반환한다. 에러가 발생하면 양수의 error number가 반환된다.(glibc 2.13으로 인해) 또는 -1이 반환되면서 errno가 설정된다.(glibc 2.13버전 미만에서)
POSIX.1-2001 및 POSIX.1-2008은 strerror() 또는 strerror_l()에 대한 성공한 호출은 변경되지 않은 상태로 유지해야 하며, 오류를 나타내기 위해 예약된 함수 반환 값이 없으므로, 오류를 확인하려는 응용 프로그램은 호출 전에 errno를 0으로 초기화해야 하며, 호출 후 errno를 확인해야 한다.
-
ERRORS
EINVAL 유효한 error number가 아닌 수에 대한 오류 ERANGE error를 표현 문자열을 담기에 부족한 용량
댓글남기기