C언어에서 exit() 함수는 프로그램을 즉시 강제 종료하는 함수이다.
종료의 목적은 여러가지가 있지만, 치명적인 오류로 비정상 동작하는 프로그램를 강제로 종료시킬 수 있으며, 정상적인 종료인 경우 OS에 상태 코드를 포함하여 종료 상태를 전달할 수 있다.
1.C언어 exit() 종료 함수 목적
시작이 있으면 종료가 있다.
C언어 또한 종료를 위한 함수가 존재하는데, exit() 함수이다.
return 이 프로그램 흐름의 종료를 위한 목적이라면, exit() 종료 함수는 윈도우, 맥OS, 리눅스와 같은 OS 시스템에 프로그램의 종료를 명시적으로 전달한다.
프로그램의 정상적인 흐름은 희망사항일 수 있고, 역사가 깊은 윈도우 또한 지금도 유지보수를 위한 업데이트를 꾸준히 하고 있다.
프로그램의 비정상적인 동작은 오류를 발생하고, 하나의 프로그램 때문에 전체 프로그램을 사용하지 못하는 경우도 발생할 수 있다.
이런 예상치 못한 에러들이 발생하여 프로그램이 비정상적인 동작을 멈추고자 할 때 exit() 함수를 사용하여 강제 종료하고 OS 시스템에 프로그램의 종료를 알리고, OS는 프로그램이 사용했던 메모리부터 리소스 등을 모두 회수하도록 한다.
즉, exit() 종료 함수는 프로그램을 강제로 종료하면서 OS에 알리고, OS는 이런 종료된 프로그램이 사용한 모든 요소를 다시 돌려받고, 다른 프로그램의 동작에 문제가 없도록 한다.
단순히 생각하면, 비정상적인 동작 중인 프로그램 강제종료라 생각하자.
우리가 생각하는 윈도우의 Ctrl+Alt+Del 기능의 `작업 끝내기`와 같다.
2.종류와 목적
C 프로그래밍을 하면서 프로그램을 강제로 종료하는 경우들이 있겠지만, 섬세한 조건 처리가 동반되면 이런 종료 함수들은 잘 사용하지 않게 될 것이고, 종료를 해야 하는 특정 조건 만이 눈 앞에 보일 것이다.
어쨌든, return 문 외의 사용되는 시스템적인 강제 종료 방법은 다음과 같다.
- exit()
- 정상 종료 - abort()
- 비정상 종료 - _Exit()
- 즉시 종료
모두 프로그램을 강제 종료하는 것들이며, 일단 이 구문을 만나는 순간 동작 중인 프로그램은 종료되고, 이후 구문은 실행되지 않는다.
3.예제 코드
이제 C언어에서 사용하는 종료 함수 3가지를 사용해 보자.
C언어에서 종료함수는 exit(), abort(), _Exit() 가 있다.
공통점은 종료이며, 각각 정상, 비정상, 즉시 종료라는 차이가 있다.
이들의 차이를 살펴보기 위해 하나씩 코드를 만들어 본다.
3.1.exit() - 시스템에 프로그램의 종료를 알린다.
C언어에서 exit() 함수는 즉시 종료이다.
프로그램을 강제로 종료시키고 시스템 ( OS ) 에 프로그램의 종료를 알린다.
이 때 OS 시스템은 종료된 시스템이 차지한 메모리와 리소스 등을 반환받고 재사용하기 위해 준비한다.
exit() 함수에 파라미터를 추가하는 경우 0 또는 N 의 숫자를 설정하여, 실행할 수 있다.
exit(0) 인 경우, OS 시스템에 프로그램의 정상 종료임을 알리고, exit(1 또는 N)인 경우 비정상적 동작에 의한 종료임을 알린다.
아래는 exit() 함수의 종료에 대한 예제 코드이다.
#include <stdio.h>
/* 함수 선언 */
void CallExit(void);
/* 프로그램 시작 */
int main(void)
{
printf("\n----- Start 04-Exit \n\n");
/* 프로그램 종료 */
CallExit();
printf("\n----- End \n\n");
/* 정상 종료 */
return 0;
}
void CallExit(void)
{
printf("----- 프로그램 종료\n\n");
exit();
}exit() 함수를 호출하는 CallExit() 함수를 만들어 main() 에서 호출하도록 하였다.
exit() 함수를 만나는 순간 프로그램은 중단되며, 이후 코드는 실행되지 않는 것을 볼 수 있다.
3.2.abort()
C 언어에서 abort() 함수의 목적은 프로그램을 즉시 비정상 종료시키는 것이다.
프로그램이 아무리 잘 만들어 졌다고 해도, 어딘가 버그는 존재하고, 특히 불특정 사용자가 많을 경우 예상치 못한 오류가 발생할 수 있다.
이런 경우 치명적 오류로 인한 프로그램의 정상적인 동작을 할 수 없을 때 abort() 함수를 사용하여 실행 중인 프로그램그램을 종료시킬 수 있다.
다만, 이런 치명적인 오류가 어떤 경우인지 찾는게 문제일 것이며, 지금의 OOP 에서 try~catch 정도로 생각할 수도 있을 것이다.
abort() 함수를 사용하는 예제 코드는 다음과 같다.
#include <stdio.h>
/* 함수 선언 */
void CallAbort(void);
/* 프로그램 시작 */
int main(void)
{
printf("\n----- Start 04-Abort \n\n");
/* 프로그램 종료 */
CallAbort();
printf("\n----- End \n\n");
/* 정상 종료 */
return 0;
}
void CallAbort(void)
{
printf("----- 프로그램 종료\n\n");
abort();
}결과가 조금 다르다.
프로그램이 즉시 종료된 것은 exit() 함수와 같지만 메세지창이 표시된다.
메세지창의 의미는 비정상적인 흐름 때문에 프로그램이 강제 종료되었다는 것을 의미한다.
물론, 이것은 시스템에 abort() 종료 함수를 사용해 시스템 OS에 전달했기 때문이며, 코드 자체로는 정상이다.
3.3._Exit()
C언어에서 _Exit() 함수는 현재 실행 중인 프로그램을 즉시 종료하는 함수이다.
다만, 종료 과정을 무시하고, OS에 종료를 직접 요청한다는 점에 차이가 있다.
모든 시스템에는 코드와 눈에 보이지 않는 절차라는 것이 있는데, 그 절차를 무시하고 OS에 직접 종료를 알리는 것이다.
요청 보다는 통보에 가깝다고 볼 수 있다.
( 중간 관리자 패싱 ~ 뭐, 이런 느낌이다. )
C언어에서 사용되는 _Exit() 함수에 대한 코드는 다음과 같다.
#include <stdio.h>
/* 함수 선언 */
void CallExit(void);
/* 프로그램 시작 */
int main(void)
{
printf("\n----- Start 04-_Exit \n\n");
/* 프로그램 종료 */
CallExit();
printf("\n----- End \n\n");
/* 정상 종료 */
return 0;
}
void CallExit(void)
{
printf("----- 프로그램 종료\n\n");
_Exit();
}결과를 보자.
즉시 종료하는 상황은 같고, 메세지 또한 다른 즉시 종료 함수와 다르지 않다.
_Exit() 함수 이후 코드는 실행되지 않으며 프로그램은 즉시 바로 종료되었다.
다만, 눈에 보이지 않는 내부적인 프로세스에 따라 차이가 발생할 뿐이다.
_Exit() 함수가 종료 처리 절차를 무시하고, 프로그램을 즉시 종료한 후 종료에 대한 결과만 OS에 요청하는 점에 주목하자.



.webp)
댓글
댓글 쓰기