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에 프로토타입이 선언되어 있다.
'크래프톤 정글 (컴퓨터 시스템: CSAPP) > 8장 예외적 제어 흐름' 카테고리의 다른 글
컴퓨터 시스템 : CSAPP 8장 정리 - 8.5 Signals Part.2 8.5.7 까지 (1) | 2025.04.19 |
---|---|
컴퓨터 시스템 : CSAPP 8장 정리 - 8.5 Signals Part.1 8.5.4 까지 (0) | 2025.04.19 |
컴퓨터 시스템 : CSAPP 8장 정리 - 8.4 Process Control (0) | 2025.04.19 |
컴퓨터 시스템 : CSAPP 8장 정리 - 8.2 Processes (0) | 2025.04.19 |
컴퓨터 시스템 : CSAPP 8장 정리 - 8.1 Exceptions (2) | 2025.04.19 |