`exit` 함수

exit 함수 (exit)

프로그램을 '정상적으로' 끝내는 방법 가운데 하나가 exit예요. 단순히 끝나기만 하는 게 아니라, 그 전에 해야 할 정리 작업들을 표준이 순서대로 처리해 준다는 점이 핵심이에요. 어떤 순서로 정리를 하는지 알면, return과의 차이도 자연스럽게 이해돼요.

출처: cppreference

본문

함수 원형

<stdlib.h>에 정의돼 있어요.

void exit( int exit_code );                  // (until C11)
_Noreturn void exit( int exit_code );        // (since C11, until C23)
[[noreturn]] void exit( int exit_code );     // (since C23)

설명 (Explanation)

exit를 호출하면 프로그램이 정상 종료되고, 호스트 환경으로 제어가 돌아가기 전에 다음 정리 단계가 순서대로 실행돼요.

  • atexit으로 등록된 함수들이 등록과 반대 순서로 호출돼요
  • 모든 C 스트림이 flush되고 닫혀요
  • tmpfile로 만든 파일은 제거돼요
  • 호스트 환경으로 제어가 돌아가요. exit_code0이거나 EXIT_SUCCESS면 성공적인 종료를 뜻하는 구현 정의 상태가, EXIT_FAILURE면 실패를 뜻하는 상태가, 그 외 값이면 구현 정의 상태 값이 반환돼요

매개변수 (Parameters)

  • exit_code — 프로그램의 종료 상태

반환값 (Return value)

없음.

주의할 점 (Notes)

  • at_quick_exit로 등록한 함수는 exit에서 호출되지 않아요.
  • 프로그램이 exit두 번 이상 호출하거나, exitquick_exit를 함께 호출하면 동작이 정의되지 않아요(undefined behavior).
  • atexit으로 등록된 함수를 호출하는 도중 그 함수가 longjmp로 빠져나가면 동작이 정의되지 않아요.
  • main 함수에서 return 문으로 반환하거나 함수 끝까지 도달하면, 그 반환값(또는 암시적 반환일 때 0)을 exit_code로 삼아 exit()가 실행돼요.

예제 (Example)

파일 여는 데 실패하면 EXIT_FAILURE로 즉시 끝내는 단순한 예시예요.

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

int main(void)
{
    FILE *fp = fopen("data.txt","r");
    if (fp == NULL)
    {
       fprintf(stderr, "error opening file data.txt in function main()\n");
       exit( EXIT_FAILURE );
    }
    fclose(fp);
    printf("Normal Return\n");
    return EXIT_SUCCESS ;
}

가능한 출력:

error opening file data.txt in function main()

같이 보기 (See also)

  • abort — 정리 작업 없이 비정상 종료
  • atexitexit() 호출 시 불릴 함수 등록
  • quick_exit(C11) — 완전히 정리하지 않고 정상 종료
  • EXIT_SUCCESS/EXIT_FAILURE — 종료 상태 상수