NAME

error, error_at_line, error_message_count, error_one_per_line, error_print_progname - glibc 오류 보고 함수

SYNOPSIS

#include <error.h>

void error(int status, int errnum, const char *format, ...);
void error_at_line(int status, int errnum, const char *filename,
                   unsigned int linenum, const char *format, ...);

extern unsigned int error_message_count;
extern int error_one_per_line;

extern void (*error_print_progname)(void);

DESCRIPTION

error()는 범용 오류 보고 함수다. stdout을 플러시하고 나서 stderr로 프로그램 이름, 콜론과 공백, printf(3) 방식 서식 문자열 format으로 지정한 메시지를 출력하며, errnum이 0이 아니면 두 번째 콜론과 공백, 그리고 strerror(errnum)에서 얻은 문자열을 함께 출력한다. format에 필요한 인자가 있으면 인자 목록에서 format 뒤에 따라와야 한다. 출력 내용 끝에 개행 문자가 붙는다.

error()에서 찍는 프로그램 이름은 전역 변수 program_invocation_name(3)의 값이다. program_invocation_name은 처음에는 main()argv[0]과 같은 값을 가지고 있다. 이 변수의 값을 바꾸면 error() 출력도 바뀐다.

status가 0 아닌 값이면 error()에서 그 값을 종료 상태로 해서 exit(3)를 호출해서 프로그램을 종료시킨다. 아니면 오류 메시지를 찍고서 반환한다.

error_at_line() 함수는 error()와 동일하되 추가로 filenamelinenum 인자가 있다. 내놓는 출력이 error()와 마찬가지이되 프로그램 이름 다음에 콜론, filename의 값, 콜론, linenum의 값이 들어간다. error_at_line() 호출 시에 전처리기의 값 __LINE____FILE__이 유용하긴 하지만 다른 값도 쓸 수 있다. 예를 들어 이 인자들로 입력 파일 내의 위치를 나타낼 수도 있을 것이다.

전역 변수 error_one_per_line이 0 아닌 값으로 설정돼 있으면 같은 filenamelinenum 값으로 연달아 error_at_line()을 호출하면 (처음의) 메시지 한 개만 찍히게 된다.

전역 변수 error_message_counterror()error_at_line()으로 지금껏 출력한 메시지 수를 센다.

전역 변수 error_print_progname에 함수 주소가 할당돼 있으면 (즉 NULL이 아니면) 메시지 앞의 프로그램 이름과 콜론을 출력하지 않고 대신 그 함수를 호출한다. 그러면 그 함수에서 stderr로 적당한 문자열을 찍어야 한다.

ATTRIBUTES

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

인터페이스 속성
error() 스레드 안전성 MT-Safe locale
error_at_line() 스레드 안전성 MT-Unsafe race: error_at_line/error_one_per_line locale

내부적으로 error_one_per_line 변수에 접근이 이뤄진다. (어떤 동기화도 없지만 int를 한 번 이용하는 것이므로 충분히 안전할 것이다.) 그리고 error_one_per_line이 0 아닌 값으로 설정돼 있는 경우에는 마지막으로 찍은 파일 이름과 행 번호를 담는 (사용자에게 노출되지 않는) 정적 변수들에 동기화 없는 접근 및 변경이 이뤄진다. 갱신이 원자적이지 않으며 취소를 비활성화하기 전에 이뤄지기 때문에 두 변수 중 하나만 변경되고 실행이 중단될 수 있다. 그 외에는 error_at_line()error()와 거의 같다.

CONFORMING TO

이 함수 및 변수들은 GNU 확장이므로 이식성이 있어야 하는 프로그램에서는 쓰지 말아야 한다.

SEE ALSO

err(3), errno(3), exit(3), perror(3), program_invocation_name(3), strerror(3)


2021-03-22