exit() 함수란?
exit() 함수는 호출 시점에 프로그램 실행을 즉시 종료하고, 이후의 코드는 더 이상 실행하지 않는 함수입니다. exit()가 호출되면 프로세스가 종료되며, C++에서는 자동 저장 기간을 가진 객체들의 소멸자가 호출되고 열려 있는 스트림의 버퍼가 플러시되는 등의 정리 작업이 수행됩니다.
C 언어에서 exit() 함수는 <stdlib.h> 헤더 파일에 선언되어 있으며, 아무 값도 반환하지 않습니다(void 타입).
exit() 문법
void exit(int status_value);
status_value − 부모 프로세스(호출한 환경)에 반환되는 종료 상태 값입니다. 일반적으로 0은 정상 종료를, 0이 아닌 값은 비정상 종료나 오류를 의미합니다.
exit() 예제
#include <stdio.h>
#include <stdlib.h>
int main() {
int x = 10;
printf("x의 값 : %d\n", x);
exit(0);
printf("exit() 호출 후");
return 0;
}
실행 결과
x의 값 : 10
위 프로그램에서 변수 x가 값으로 초기화되고, 그 값이 출력된 뒤 exit() 함수가 호출됩니다. exit()가 호출되는 순간 프로그램은 즉시 종료되기 때문에, 그 뒤에 있는 printf() 문장은 실행되지 않습니다.
int x = 10;
printf("x의 값 : %d\n", x);
exit(0);
_Exit() 함수란?
_Exit() 함수는 프로세스를 정상적으로 종료하면서 제어를 호스트 환경(운영체제)으로 반환하는 함수입니다. 하지만 exit()와 달리 다음과 같은 정리 작업을 전혀 수행하지 않습니다.
- 객체의 소멸자 호출 안 함
- 스트림 버퍼 플러시 안 함
atexit()로 등록된 함수 호출 안 함- 임시 파일 삭제 등의 후처리 안 함
_Exit() 문법
void _Exit(int status_value);
status_value − 부모 프로세스에 반환되는 종료 상태 값입니다.
_Exit() 예제
#include <stdio.h>
#include <stdlib.h>
int main() {
int x = 10;
printf("x의 값 : %d\n", x);
_Exit(0);
printf("_Exit() 호출 후");
return 0;
}
위 프로그램에서는 출력 결과가 화면에 표시되지 않으며, 오류도 발생하지 않습니다. 그 이유는 _Exit()가 버퍼를 플러시하지 않고 프로세스를 즉시 종료하기 때문입니다. printf()의 출력이 아직 버퍼에 남아 있는 상태로 프로그램이 끝나버려서 결과가 사라지게 됩니다.
exit() vs _Exit() 핵심 차이 요약
| 구분 | exit() | _Exit() |
|---|---|---|
| 소멸자 호출 | 호출함 | 호출하지 않음 |
| 버퍼 플러시 | 수행함 | 수행하지 않음 |
| atexit() 등록 함수 | 호출함 | 호출하지 않음 |
| 종료 속도 | 정리 작업으로 인해 상대적으로 느림 | 즉시 종료 |
따라서 정상적인 프로그램 종료에는 exit()를 사용하는 것이 좋고, 자식 프로세스 종료 시 정리 작업이 오히려 문제를 일으킬 수 있는 특수한 상황(예: fork() 직후)에서는 _Exit()를 사용하는 것이 적합합니다.