NAME

perror - 시스템 오류 메시지 찍기

SYNOPSIS

#include <stdio.h>

void perror(const char *s);

#include <errno.h>

const char * const sys_errlist[];
int sys_nerr;
int errno;       /* 실제 이렇게 선언돼 있지 않음. errno(3) 참고 */

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

sys_errlist, sys_nerr:
glibc 2.19부터 2.31까지:
_DEFAULT_SOURCE
glibc 2.19 및 이전:
_BSD_SOURCE

DESCRIPTION

perror() 함수는 시스템 내지 라이브러리 함수 호출 중 만난 최종 오류를 설명하는 메시지를 표준 오류로 내놓는다.

먼저 (s가 NULL이 아니고 *s가 널 바이트('\0')가 아니면) 인자 문자열 s를 찍고 이어서 콜론과 공백을 찍는다. 다음으로 현재 errno 값에 해당하는 오류 메시지와 개행이 온다.

제대로 쓰려면 인자 문자열에 오류가 발생한 함수의 이름을 포함시키는 게 좋다.

전역 오류 목록 sys_errlist[]errno를 인덱스로 사용해서 개행 없는 오류 메시지를 얻을 수 있다. 이 테이블에서 제공하는 가장 높은 메시지 번호는 sys_nerr-1이다. 새 오류 값이 sys_errlist[]에 추가되지 않았을 수도 있으므로 이 목록에 직접 접근할 때는 조심해야 한다. 요즘은 sys_errlist[]를 쓰지 않는 게 좋다. 대신 strerror(3)를 사용하라.

시스템 호출이 실패하면 보통 -1을 반환하면서 errno에다가 뭐가 잘못됐는지 설명하는 값을 설정한다. (이 값들을 <errno.h>에서 볼 수 있다.) 여러 라이브러리 함수들도 비슷하다. perror() 함수는 그 오류 코드를 사람이 읽을 수 있는 형태로 바꿔 주는 역할을 한다. 참고로 시스템 호출이나 라이브러리 함수 호출이 성공한 후의 errno는 규정돼 있지 않다. 성공하는 경우에도 호출에서 그 변수를 바꿀 수 있는데, 예를 들어 내부적으로 이용한 어떤 다른 라이브러리 함수가 실패해서일 수 있다. 따라서 실패한 호출 바로 다음에서 perror()를 호출하는 게 아닌 경우에는 errno 값을 저장해 두는 게 좋다.

VERSIONS

glibc 버전 2.32부터 <stdio.h>에서 더이상 sys_errlistsys_nerr 선언을 드러내지 않는다.

ATTRIBUTES

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

인터페이스 속성
perror() 스레드 안전성 MT-Safe race:stderr

CONFORMING TO

perror(), errno: POSIX.1-2001, POSIX.1-2008, C89, C99, 4.3BSD.

외부 변수 sys_nerrsys_errlist는 BSD에서 온 것이며 POSIX.1에는 명세돼 있지 않다.

NOTES

glibc에 외부 변수 sys_nerrsys_errlist가 정의돼 있기는 한데 <stdio.h>에 있다.

SEE ALSO

err(3), errno(3), error(3), strerror(3)


2021-03-22