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를 표현 문자열을 담기에 부족한 용량
댓글남기기