더북(TheBook)

TAKEAWAY 8.26 exit가 아닌 다른 함수로 프로그램을 종료시키면 라이브러리가 종료 전 마무리 작업을 수행할 수 없어서 바람직하지 않는다.

프로그램 종료 시점에 정리(cleanup)하는 것은 굉장히 중요하다. 런타임 시스템은 쓰기 작업을 한 파일이나 프로그램이 사용하던 리소스를 비우기(flush)하고 닫는다. 이는 기본 동작이므로 이를 건너뛰는 경우는 극히 드물다.

프로그램이 종료할 때 실행될 핸들러(handler)C를 프로그래머가 직접 정의하도록 하는 메커니즘도 제공한다. 이를 위해 다음과 같은 두 가지 함수를 제공한다.

int atexit(void func(void));
int at_quick_exit(void func(void));

이 함수를 보면 아직 배우지 않은 기능인 함수 매개변수(function parameter)C가 나온다. 가령 첫 번째 함수인 atexit 함수는 func 함수를 매개변수로 받아서 int 값을 리턴한다.3 설명은 이 정도로 하고 이 함수를 사용하는 예를 간단히 살펴보자.

void sayGoodBye(void) {
  if (errno) perror("terminating with error condition");
  fputs("Good Bye\n", stderr);
}

int main(int argc, char* argv[argc+1]) {
  atexit(sayGoodBye);
...
}

 

 


3 실제로 C에서 atexit 함수의 func 같은 함수 매개변수는 함수 포인터(function pointer)C를 전달하는 것과 같다. 이런 함수 대부분은 포인터 버전도 함께 나와 있다. 아직은 이를 구체적으로 구분할 만한 레벨에 도달하지 않았으므로 여기서는 함수를 참조 방식으로 전달한다는 정도로만 이해하고 넘어가자.

신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.