이번 글에서는 C와 C++에서 사용되는 exit() 함수와 _Exit() 함수의 차이점을 자세히 알아보겠습니다. 두 함수 모두 프로세스를 종료하는 역할을 하지만, 동작 방식에는 중요한 차이가 있습니다.
exit() 함수란?
C 언어의 exit() 함수는 호출된 프로세스를 즉시 종료하며, exit() 함수 호출 이후에 작성된 나머지 코드는 실행되지 않습니다.
중요한 점은 exit()가 프로그램을 종료하기 전에 여러 가지 정리(cleanup) 작업을 수행한다는 것입니다. 예를 들면 다음과 같습니다.
- 열려 있는 입출력 버퍼의 플러시(flush)
- 열린 파일 및 스트림 닫기
- 임시 파일 삭제
- atexit()로 등록된 함수들 호출
_Exit() 함수란?
C++11부터는 새로운 함수인 _Exit()가 표준에 포함되었습니다. 그렇다면 이 함수의 특징은 무엇일까요?
_Exit() 함수는 아무런 정리 작업 없이 프로세스를 즉시 종료합니다. 즉, 버퍼를 플러시하거나 스트림을 닫는 작업을 수행하지 않으며, atexit() 메서드로 등록해 둔 함수도 호출되지 않습니다.
예제 1: exit() 함수 사용
먼저 exit() 함수를 사용한 예제를 살펴보겠습니다.
#include<bits/stdc++.h>
using namespace std;
void my_function(void) {
cout << "Exiting from program";
}
int main() {
atexit(my_function);
exit(10);
}실행 결과
Exiting from program
위 코드에서는 atexit()으로 my_function을 등록한 뒤 exit(10)을 호출했습니다. exit()는 종료 전에 정리 작업을 수행하면서 등록된 함수를 호출하기 때문에, "Exiting from program"이라는 문구가 출력됩니다.
예제 2: _Exit() 함수 사용
이번에는 동일한 코드에서 _Exit() 함수를 사용해 보겠습니다.
#include<bits/stdc++.h>
using namespace std;
void my_function(void) {
cout << "Exiting from program";
}
int main() {
atexit(my_function);
_Exit(10);
}실행 결과
(출력 없음)
이 경우 출력은 완전히 비어 있습니다. _Exit()는 정리 작업 없이 즉시 종료되기 때문에, atexit()으로 등록한 my_function이 호출되지 않은 것입니다.
정리
두 함수의 핵심 차이를 요약하면 다음과 같습니다.
exit(): 종료 전 정리 작업 수행 — 버퍼 플러시, 스트림 닫기, atexit()에 등록된 함수 호출
_Exit(): 어떠한 정리 작업도 수행하지 않고 프로세스를 즉시 종료
따라서 종료 시 리소스 정리가 필요한 일반적인 상황에서는 exit()를 사용하는 것이 좋고, 최대한 빠르게 프로세스를 종료해야 하는 특수한 경우(예: 자식 프로세스 생성 후 exec 계열 함수 호출 직전)에는 _Exit()가 유용합니다.