시스템 콜의 에러 처리

mydailylogs
|2022. 12. 7. 00:06

Unix의 시스템 수준 함수가 에러를 만날 경우에는 대개 -1을 리턴하고 errno를 세팅해서 무엇이 잘못되었는지를 나타내게 된다.

예를 들어 fork 함수를 실행할 때는 다음과 같이 에러를 처리한다.

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

strerrno 함수는 errno의 특정 값과 연계된 에러를 설명하는 텍스트 스트링을 리턴한다. 이 코드를 다음과 같이 에러 리포트 함수를 정의해서 약간 단순화할 수 있다.

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

unix_error 함수를 통해 직전의 fork 함수를 다음과 같이 줄일 수 있다.

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

이 함수를 에러 핸들링 랩퍼를 통해 더 단순화할 수 있다. 랩퍼 함수는 기존 fork 와 동일한 인자를 받아 프로세스를 복제하지만 추가적으로 에러를 체크해서 만일 문제가 있다면 종료한다.

pid_t Fork(void)
{
    pid_t pid;

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

이 랩퍼를 호출할 경우 fork로 호출하는 것이 하나의 합축된 라인으로 줄어든다.

pid = Fork();

'CS > OS' 카테고리의 다른 글

프로세스를 이용한 동시성 프로그래밍  (0) 2022.12.07
프로세스 제어  (0) 2022.12.07
컨텍스트 스위치  (0) 2022.12.06
프로세스  (0) 2022.12.06
Exception Control Flow 소개  (0) 2022.12.06