_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 |
프로그램의 종료 상태 |
반환값
없음(함수가 반환하지 않아요).
예시
_Exit는 atexit에 등록된 함수를 부르지 않는다는 점을 확인하는 코드예요. 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 원문을 참고해요.