c 언어/c 표준 라이브러리(Standard C Library)

C 표준 API 프로그램 종료 및 반환값 (atexit, quick_exit)

임베디드 친구 2025. 2. 26. 13:47
728x90
반응형

C 표준 API 프로그램 종료 및 반환값 (atexit, quick_exit)

C 언어에서 프로그램이 종료될 때 실행해야 할 정리 작업이 있다면, atexit 또는 quick_exit을 사용할 수 있습니다.
이 글에서는 atexitquick_exit의 차이점을 살펴보고, 각각을 활용하는 방법을 예제 코드와 함께 설명하겠습니다.


1. atexit 함수

개요

atexit 함수는 프로그램이 exit 함수를 호출하여 정상적으로 종료될 때 실행할 콜백 함수를 등록하는 기능을 제공합니다.
이를 활용하면 프로그램 종료 전에 반드시 수행해야 하는 작업(예: 파일 닫기, 메모리 해제, 로그 기록 등)을 등록할 수 있습니다.

함수 원형

#include <stdlib.h>
int atexit(void (*func)(void));
  • func : 프로그램 종료 시 실행할 함수의 포인터
  • 반환값 : 성공하면 0을, 실패하면 0이 아닌 값을 반환

사용 예제

#include <stdio.h>
#include <stdlib.h>

void cleanup(void) {
    printf("프로그램이 종료됩니다. 정리 작업 수행 중...\n");
}

int main() {
    if (atexit(cleanup) != 0) {
        fprintf(stderr, "atexit 등록 실패\n");
        return EXIT_FAILURE;
    }

    printf("메인 함수 실행 중...\n");
    return 0;  // 프로그램 종료 시 cleanup 실행
}

실행 결과

메인 함수 실행 중...
프로그램이 종료됩니다. 정리 작업 수행 중...

특징

  • atexit으로 등록된 함수는 프로그램이 정상적으로 종료될 때 실행됨
  • 여러 개의 함수 등록 가능 (최대 개수는 구현에 따라 다름)
  • 등록된 함수는 반대로 실행됨 (마지막에 등록된 함수가 먼저 실행됨)

여러 개의 atexit 함수 등록 예제

#include <stdio.h>
#include <stdlib.h>

void cleanup1(void) { printf("Cleanup 1 실행\n"); }
void cleanup2(void) { printf("Cleanup 2 실행\n"); }

int main() {
    atexit(cleanup1);
    atexit(cleanup2);

    printf("메인 함수 실행 중...\n");
    return 0;
}

실행 결과

메인 함수 실행 중...
Cleanup 2 실행
Cleanup 1 실행

2. quick_exit 함수

개요

quick_exit 함수는 exit와 유사하지만, 일반적인 종료 과정 (atexit 실행 등)을 생략하고 빠르게 프로그램을 종료합니다.
이를 위해 at_quick_exit을 사용하여 종료 시 실행할 함수를 등록할 수 있습니다.

함수 원형

#include <stdlib.h>
void quick_exit(int status);
int at_quick_exit(void (*func)(void));
  • quick_exit(int status): 빠른 종료 수행
  • at_quick_exit(void (*func)(void)): quick_exit 호출 시 실행할 함수를 등록
  • at_quick_exit 반환값: 성공 시 0, 실패 시 0이 아닌 값 반환

사용 예제

#include <stdio.h>
#include <stdlib.h>

void quick_cleanup(void) {
    printf("quick_exit 호출: 정리 작업 수행 중...\n");
}

int main() {
    if (at_quick_exit(quick_cleanup) != 0) {
        fprintf(stderr, "at_quick_exit 등록 실패\n");
        return EXIT_FAILURE;
    }

    printf("메인 함수 실행 중...\n");
    quick_exit(0);

    // 아래 코드는 실행되지 않음
    printf("이 메시지는 출력되지 않습니다.\n");
    return 0;
}

실행 결과

메인 함수 실행 중...
quick_exit 호출: 정리 작업 수행 중...

특징

  • quick_exit을 호출하면 등록된 at_quick_exit 함수만 실행됨
  • atexit에 등록된 함수는 실행되지 않음
  • 프로그램이 비정상 종료될 때 (abort 호출, 시스템 종료 등) quick_exit 함수는 실행되지 않음

3. atexit vs quick_exit 비교

기능 atexit quick_exit
함수 호출 시점 exit 호출 시 실행됨 quick_exit 호출 시 실행됨
정리 작업 등록 함수 atexit(func) at_quick_exit(func)
여러 개 등록 가능 여부 가능 (역순 실행) 가능 (역순 실행)
exit(0)에서 실행 여부 실행됨 실행되지 않음
quick_exit(0)에서 실행 여부 실행되지 않음 실행됨
abort()에서 실행 여부 실행되지 않음 실행되지 않음

4. 결론

atexitquick_exit은 프로그램 종료 시 필요한 정리 작업을 수행하는데 유용한 함수입니다.

  • atexit: 일반적인 종료 처리 (exit) 시 실행
  • quick_exit: 빠른 종료가 필요할 때 (quick_exit) 실행
  • at_quick_exit: quick_exit 시 실행할 정리 작업을 등록

일반적인 경우 atexit을 사용하여 종료 처리를 등록하면 충분하지만, 긴급한 종료가 필요할 경우 quick_exit을 사용할 수 있습니다.

특히 quick_exitatexit의 콜백을 실행하지 않으므로, at_quick_exit을 별도로 등록해야 한다는 점을 유의해야 합니다.


이제 atexitquick_exit을 활용하여 보다 안정적인 프로그램 종료 처리를 구현해 보세요!

반응형