System Call Error Handling: 두 판 사이의 차이
youngwiki
편집 요약 없음 |
편집 요약 없음 |
||
| (같은 사용자의 중간 판 3개는 보이지 않습니다) | |||
| 1번째 줄: | 1번째 줄: | ||
[[분류:컴퓨터 시스템]] | [[분류:컴퓨터 시스템]] | ||
==개요== | |||
유닉스 시스템 수준의 함수가 오류를 만나면 일반적으로 -1을 반환하고 전역 정수 변수 errno를 설정하여 그 원인을 지시한다. System Call Error Handling을 위해서는 해당 특성을 이용하여 모든 시스템 수준 함수의 return status를 반드시 확인해야 한다.<ref>예외는 void를 반환하는 몇몇 함수들 뿐이다.</ref> | |||
==fork() 함수를 통한 예시== | |||
아래는 fork() 함수를 호출하고 오류를 확인하는 코드이다. | |||
<syntaxhighlight lang = "c"> | |||
if ((pid = fork()) < 0) { | |||
fprintf(stderr, "fork error: %s\n", strerror(errno)); | |||
exit(); | |||
} | |||
</syntaxhighlight> | |||
이때 streerror 함수는 errno값을 인자로 받아서 관련된 오류를 설명하는 텍스트 문자열을 반환한다. | |||
이를 이용해 unix_error(char* msg)함수를 새로 정의하여 위 코드를 간소화 할 수 있다. | |||
<syntaxhighlight lang="c"> | |||
void unix_error(char *msg) /* Unix-style error */ { | |||
fprintf(stderr, "%s: %s\n", msg, strerror(errno)); | |||
exit(0); | |||
} | |||
</syntaxhighlight> | |||
<syntaxhighlight lang="c"> | |||
if ((pid = fork()) < 0) | |||
unix_error("fork error"); | |||
</syntaxhighlight> | |||
위를 error-handling wrapper를 사용하여 더욱 간단하게 만들 수 있다. 임의의 함수이름이 foo라고 할 때, 첫 글자를 대문자로 바꾸어 래퍼함수 Foo()를 정의할 수 있다. Foo()함수는 기본함수를 호출한 후, 오류를 확인하며, 문제가 생기면 프로그램을 종료한다. 아래는 fork() 함수에 대한 래퍼함수이다. | |||
<syntaxhighlight lang="c"> | |||
pid_t Fork(void) { | |||
pid_t pid; | |||
if ((pid = fork()) < 0) | |||
unix_error("Fork error"); | |||
return pid; | |||
} | |||
</syntaxhighlight> | |||
위 래퍼함수를 통해서 fork() 함수의 호출은 아래의 한 줄로 정리될 수 있다. | |||
<syntaxhighlight lang="c"> | |||
pid = Fork(); | |||
</syntaxhighlight> | |||
==각주== | |||
2025년 3월 11일 (화) 18:36 기준 최신판
개요
유닉스 시스템 수준의 함수가 오류를 만나면 일반적으로 -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();
각주
- ↑ 예외는 void를 반환하는 몇몇 함수들 뿐이다.