Computer >> 컴퓨터 >  >> 프로그래밍 >> C 프로그래밍

C/C++에서 exit()와 _Exit()의 차이점 완벽 정리


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()를 사용하는 것이 적합합니다.