Loading [MathJax]/jax/output/CommonHTML/jax.js

c 언어/c 표준 라이브러리(Standard C Library)

errno.h 개요 및 에러 처리 (errno, strerror, perror)

임베디드 친구 2025. 3. 3. 10:27
728x90
반응형

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 errnostrerror() 활용

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 활용 시 주의점

  1. errno 값은 직접 변경하지 않기
    • errno는 시스템 함수 호출 시 자동으로 변경되므로, 직접 설정하는 것은 피해야 합니다.
  2. 함수 호출 후 errno 값 확인
    • errno는 실패한 함수 호출 후에만 확인해야 합니다.
    • 성공적인 호출 후에도 errno 값이 유지될 수 있으므로, errno = 0;을 명시적으로 초기화한 후 오류를 확인하는 것이 좋습니다.
  3. 멀티스레드 환경에서는 errno를 조심해서 사용
    • POSIX 스레드 환경에서는 errno가 스레드마다 독립적으로 유지되지만, 일부 환경에서는 다를 수 있습니다.

5. 결론

errno.h는 C 언어에서 표준적인 오류 처리를 수행하는 중요한 헤더 파일입니다.
errno 변수를 통해 오류를 확인하고, strerror() 또는 perror()를 사용하여 사용자에게 적절한 오류 메시지를 제공할 수 있습니다.

안전한 프로그램을 작성하기 위해 errno 값을 적절히 관리하고, 함수 호출 후 오류 처리를 철저히 하는 것이 중요합니다.

이제 errno.h를 활용한 오류 처리 방법을 코드에 적용하여 더욱 안정적인 C 프로그램을 작성해 보세요!

반응형