_Exit

_Exit

프로그램을 끝내되, atexit으로 등록한 정리 함수도 안 부르고 버퍼 flush도 신경 쓰지 않고 바로 끝내고 싶을 때가 있어요. 그럴 때 쓰는 함수가 _Exit예요. <stdlib.h>에 정의돼 있어요.

출처: cppreference

본문

_Exit()는 자원을 완전히 정리하지 않고 정상적인 프로그램 종료를 일으켜요.

  • atexit()at_quick_exit()에 등록된 함수는 호출되지 않아요.
  • 쓰지 않은 버퍼 데이터를 가진 열린 스트림의 flush 여부, 열린 스트림의 닫힘 여부, 임시 파일 제거 여부는 모두 구현에 따라 정의돼요.
void _Exit( int exit_code );                // (since C99)
_Noreturn void _Exit( int exit_code );      // (since C11)
[[noreturn]] void _Exit( int exit_code );   // (since C23)

exit_code가 0이거나 EXIT_SUCCESS면 성공 종료를 나타내는 구현 정의 상태가 호스트 환경에 반환돼요. EXIT_FAILURE면 실패를 나타내는 상태가, 그 외의 값이면 역시 구현 정의 상태가 반환돼요.

매개변수

매개변수 설명
exit_code 프로그램의 종료 상태

반환값

없음(함수가 반환하지 않아요).

예시

_Exitatexit에 등록된 함수를 부르지 않는다는 점을 확인하는 코드예요. exit와의 차이가 바로 여기서 드러나요.

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

/* _Exit does not call functions registered with atexit. */
void f1(void)
{
    puts("pushed first");
}

void f2(void)
{
    puts("pushed second");
}

int main(void)
{
    printf("Enter main()\n");
    atexit(f1);
    atexit(f2);
    fflush(stdout);   /* _Exit may not flush unwritten buffered data */
    _Exit(0);
}

출력:

Enter main()

등록한 f1, f2가 호출되지 않았죠? exit()였다면 두 함수가 차례로 불렸을 거예요.

더 알아보기

  • 정상 종료지만 정리를 수행하는 함수는 exit()을 봐요.
  • 정리를 하지 않는 비정상 종료 함수는 abort()를 봐요.
  • cppreference의 _Exit 원문을 참고해요.