Toggle menu
Toggle preferences menu
Toggle personal menu
Not logged in
Your IP address will be publicly visible if you make any edits.

System Call Error Handling

From noriwiki

개요

유닉스 시스템 수준의 함수가 오류를 만나면 일반적으로 -1을 반환하고 전역 정수 변수 errno를 설정하여 그 원인을 지시한다. System Call Error Handling을 위해서는 해당 특성을 이용하여 모든 시스템 수준 함수의 return status를 반드시 확인해야 한다.[1]

fork() 함수를 통한 예시

아래는 fork() 함수를 호출하고 오류를 확인하는 코드이다.

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

이때 streerror 함수는 errno값을 인자로 받아서 관련된 오류를 설명하는 텍스트 문자열을 반환한다.

이를 이용해 unix_error(char* msg)함수를 새로 정의하여 위 코드를 간소화 할 수 있다.

void unix_error(char *msg) /* Unix-style error */ {
    fprintf(stderr, "%s: %s\n", msg, strerror(errno));
    exit(0); 
}
if ((pid = fork()) < 0) 
    unix_error("fork error");

위를 error-handling wrapper를 사용하여 더욱 간단하게 만들 수 있다. 임의의 함수이름이 foo라고 할 때, 첫 글자를 대문자로 바꾸어 래퍼함수 Foo()를 정의할 수 있다. Foo()함수는 기본함수를 호출한 후, 오류를 확인하며, 문제가 생기면 프로그램을 종료한다. 아래는 fork() 함수에 대한 래퍼함수이다.

pid_t Fork(void) {
    pid_t pid;
    if ((pid = fork()) < 0) 
        unix_error("Fork error");
    return pid; 
}

위 래퍼함수를 통해서 fork() 함수의 호출은 아래의 한 줄로 정리될 수 있다.

pid = Fork();


각주

  1. 예외는 void를 반환하는 몇몇 함수들 뿐이다.