[C/C++] exit 함수

d2h10s·2022년 2월 7일
0

C/C++

목록 보기
6/9

EXIT CODE

프로그램을 콘솔로 실행하고 종료하다 보면 이런 문구를 본 적이 있을겁니다.

"9664 프로세스가 0 코드로 인해 종료되었습니다."

또는

"9664 프로세스가 1 코드로 인해 종료되었습니다."

와 같은 종료 문구가 있습니다. 여기서 0 코드, 1코드란 프로그램의 종료가 정상적으로 이루어졌는지 아닌지를 나타내는 코드입니다.
stdlib.h에는 다음과 같은 상수가 정의되어 있습니다.

상수정의된값
EXIT_SUCCESS0
EXIT_FAILURE1

void exit(int status)

stdlib.h 헤더파일에 있는 void exit(int status) 함수를 통하여 런타임에 임의로 프로세스 종료를 명령하고 종료 코드를 전달할 수도 있습니다.
exit 함수가 호출되면 atexit()함수로 등록한 종료 핸들러를 모두 처리하고 표준 입출력 스트림을 닫는 작업을 수행한 후 커널의 정상 종료 작업을 실행합니다. 이 과정을 생략하려면 _exit() 또는 _Exit() 함수를 실행하면 됩니다.
당연하게도 exit를 만나면 그 아래에 있는 코드는 실행이 되지 않습니다.

관습적으로 적는 main 함수의 마지막의 return 0;는 exit(0);와 동일합니다.

int atexit(void(*func)(void))

stdlib.h 헤더파일에 있는 함수로 프로세스 종료 시 실행하는 종료 핸들러 함수를 등록하는 함수입니다.
매개변수가 없는 함수를 매개변수로 받고 등록 성공 시 0, 실패 시 1을 반환하는 함수입니다.

등록한 함수는 프로세스 계층 구조와 같이 stack구조로 쌓이게 됩니다.

Example

#include <stdlib.h>
#include <stdio.h>
 
void EndFuncA(void);
void EndFuncB(void);
void EndFuncC(void);
void Test(void);
 
int main(void)
{
    atexit(EndFuncA);//프로그램 종료할 때 수행할 EndFuncA 함수 등록
    atexit(EndFuncB);//프로그램 종료할 때 수행할 EndFuncB 함수 등록
    atexit(EndFuncC);//프로그램 종료할 때 수행할 EndFuncC 함수 등록
 
    Test();
    printf("Here is main\n");
 
    return 0;
}
void EndFuncA(void)
{
    printf("Here is EndFuncA\n");
}
void EndFuncB(void)
{
    printf("Here is EndFuncB\n");
}
void EndFuncC(void)
{
    printf("Here is EndFuncC\n");
}
void Test(void)
{
    printf("Test 1\n");
    exit(0);//프로그램 종료
    printf("Test 2\n");
}

소스코드 출처 - 언제나 휴일

Test 1
Here is EndFuncC
Here is EndFuncB
Here is EndFuncA

Test() 함수 뒤에 "Here is main\n" 문구가 보이고, Test() 함수에서 exit(0) 코드 아래에 "Test 2\n"를 출력하는 코드도 보입니다.
하지만 exit를 만나는 시점에서 프로세스가 종료되기 때문에 실행되지 않습니다.
또한 A -> B -> C 순서대로 호출을 하였지만 stack에 쌓이기 때문에 실행될 때는 C -> B -> A 순서대로 문구가 출력되는 모습을 확인할 수 있습니다.

profile
Embedded SW Engineer 최호승입니다.

0개의 댓글