`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_code가0이거나EXIT_SUCCESS면 성공적인 종료를 뜻하는 구현 정의 상태가,EXIT_FAILURE면 실패를 뜻하는 상태가, 그 외 값이면 구현 정의 상태 값이 반환돼요
매개변수 (Parameters)
exit_code— 프로그램의 종료 상태
반환값 (Return value)
없음.
주의할 점 (Notes)
- at_quick_exit로 등록한 함수는
exit에서 호출되지 않아요. - 프로그램이
exit를 두 번 이상 호출하거나,exit와quick_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— 정리 작업 없이 비정상 종료atexit—exit()호출 시 불릴 함수 등록quick_exit(C11) — 완전히 정리하지 않고 정상 종료EXIT_SUCCESS/EXIT_FAILURE— 종료 상태 상수