errno.h
개요 및 에러 처리 (errno
, strerror
, perror
)
1. 개요
C 언어에서 프로그램 실행 중 오류가 발생하면 적절한 오류 처리가 필요합니다.
C 표준 라이브러리는 오류 정보를 전달하기 위해 errno.h
헤더를 제공하며, 주요 함수로 errno
, strerror()
, perror()
를 활용할 수 있습니다.
이 글에서는 errno.h
의 개념과 주요 에러 처리 방법을 설명하고, 실제 예제를 통해 활용법을 알아보겠습니다.
2. errno.h
란?
errno.h
는 C 표준 라이브러리에서 제공하는 헤더 파일로, 실행 중 발생한 오류를 나타내는 전역 변수 errno
와 관련된 여러 함수를 정의하고 있습니다.
errno
변수
errno
는 정수형 변수이며, 오류 발생 시 해당 오류에 대한 특정 코드 값을 저장합니다.errno
값은 표준 라이브러리 함수 호출이 실패할 때 설정되며, 성공적인 호출 후에도 값이 유지되므로 필요할 때만 확인해야 합니다.- 직접
errno
를 수정하지 않는 것이 좋습니다.
주요 상수 값 (POSIX 표준)
다음은 errno.h
에서 정의된 주요 오류 코드들입니다.
오류 코드 | 의미 |
---|---|
EACCES |
접근 권한이 없음 |
EBADF |
잘못된 파일 디스크립터 |
EFAULT |
유효하지 않은 메모리 주소 |
EINVAL |
잘못된 인수 전달 |
EIO |
입출력 오류 |
ENOMEM |
메모리 부족 |
EPERM |
작업이 허용되지 않음 |
ESRCH |
존재하지 않는 프로세스 |
각 운영체제마다 지원하는 errno
코드가 다를 수 있습니다.
3. errno
를 활용한 에러 처리
3.1 errno
와 strerror()
활용
strerror()
함수는 errno
값을 문자열 메시지로 변환하여 반환합니다.
#include <stdio.h>
#include <errno.h>
#include <string.h>
int main() {
FILE *file = fopen("nonexistent.txt", "r");
if (file == NULL) {
printf("파일 열기 오류: %s\n", strerror(errno));
}
return 0;
}
실행 결과 (파일이 존재하지 않는 경우)
파일 열기 오류: No such file or directory
3.2 perror()
활용
perror()
함수는 현재 errno
값을 기반으로 표준 오류 출력을 통해 메시지를 출력합니다.
#include <stdio.h>
#include <errno.h>
int main() {
FILE *file = fopen("nonexistent.txt", "r");
if (file == NULL) {
perror("파일 열기 실패");
}
return 0;
}
실행 결과
파일 열기 실패: No such file or directory
3.3 errno
를 활용한 안전한 코드 작성
다음 예제는 malloc()
을 이용한 동적 메모리 할당에서 오류가 발생하는 경우를 처리하는 코드입니다.
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
int main() {
errno = 0; // 초기화
void *ptr = malloc(1024 * 1024 * 1024 * 1024); // 1TB 할당 시도
if (ptr == NULL) {
perror("메모리 할당 실패");
} else {
printf("메모리 할당 성공!\n");
free(ptr);
}
return 0;
}
실행 결과 (메모리 부족 시)
메모리 할당 실패: Cannot allocate memory
4. errno
활용 시 주의점
errno
값은 직접 변경하지 않기errno
는 시스템 함수 호출 시 자동으로 변경되므로, 직접 설정하는 것은 피해야 합니다.
- 함수 호출 후
errno
값 확인errno
는 실패한 함수 호출 후에만 확인해야 합니다.- 성공적인 호출 후에도
errno
값이 유지될 수 있으므로,errno = 0;
을 명시적으로 초기화한 후 오류를 확인하는 것이 좋습니다.
- 멀티스레드 환경에서는
errno
를 조심해서 사용- POSIX 스레드 환경에서는
errno
가 스레드마다 독립적으로 유지되지만, 일부 환경에서는 다를 수 있습니다.
- POSIX 스레드 환경에서는
5. 결론
errno.h
는 C 언어에서 표준적인 오류 처리를 수행하는 중요한 헤더 파일입니다.errno
변수를 통해 오류를 확인하고, strerror()
또는 perror()
를 사용하여 사용자에게 적절한 오류 메시지를 제공할 수 있습니다.
안전한 프로그램을 작성하기 위해 errno
값을 적절히 관리하고, 함수 호출 후 오류 처리를 철저히 하는 것이 중요합니다.
이제 errno.h
를 활용한 오류 처리 방법을 코드에 적용하여 더욱 안정적인 C 프로그램을 작성해 보세요!
'c 언어 > c 표준 라이브러리(Standard C Library)' 카테고리의 다른 글
C 표준 라이브러리와 POSIX 확장 함수 비교 (0) | 2025.03.05 |
---|---|
C 언어에서 메모리 누수 방지 및 디버깅 기법 (0) | 2025.03.04 |
C 표준 라이브러리 ctype.h 변환 함수 정리 (0) | 2025.03.02 |
C 표준 라이브러리 ctype.h 개요 및 문자 판별 함수 (0) | 2025.03.01 |
C qsort와 bsearch를 활용한 정렬 및 검색 (0) | 2025.02.28 |