크래프톤 정글 (컴퓨터 시스템: CSAPP)/8장 예외적 제어 흐름

컴퓨터 시스템 : CSAPP 8장 정리 - 8.3 System Call Error Handling

고웅 2025. 4. 19. 09:50

8.3 System Call Error Handling (시스템 콜 에러 처리)

유닉스 시스템 콜이 실패했을 때의 에러 처리 방식과, 이를 간편하게 처리하기 위한 에러 처리 래퍼(wrappers)에 대한 설명이다.

기본 에러 처리 메커니즘

  • 대부분의 Unix 시스템 콜은 실패 시 -1을 반환하고,
  • 전역 변수 errno를 설정하여 에러 원인을 나타냅니다.
  • errno는 #include <errno.h>에 정의되어 있으며, 에러 번호를 정수로 저장한다.
  • 이 번호에 대응하는 에러 메시지는 strerror(errno)를 이용해 문자열로 얻을 수 있다.

예시: fork() 시스템 콜의 에러 체크

if ((pid = fork()) < 0) {
    fprintf(stderr, "fork error: %s\n", strerror(errno));
    exit(0);
}

사용자 정의 에러 처리 함수

반복되는 에러 처리를 간소화하기 위해 에러 출력 전용 함수를 정의할 수 있다.

예: unix_error 함수

void unix_error(char *msg) {
    fprintf(stderr, "%s: %s\n", msg, strerror(errno));
    exit(0);
}

간단히 사용하기

if ((pid = fork()) < 0)
    unix_error("fork error");

에러 처리 래퍼 (Error-Handling Wrappers)

  • 시스템 콜을 감싸는 래퍼 함수를 만들어 에러 체크를 자동화하는 방식
  • 예: fork()를 감싸는 Fork() 함수
pid_t Fork(void) {
    pid_t pid;
    if ((pid = fork()) < 0)
        unix_error("Fork error");
    return pid;
}

→ 이제 간단하게 다음처럼 사용할 수 있음:

pid = Fork();

정리 및 목적

  • 이 책에서는 이후 모든 시스템 콜 예제에 대해 이러한 래퍼를 사용한다.
  • 이를 통해 에러 체크를 생략한 듯 보이지만 실제로는 포함된 코드를 유지한다.
  • csapp.c에 래퍼 함수가 정의되어 있고, csapp.h에 프로토타입이 선언되어 있다​.