C언어 프로그램 종료 방법 3가지 비교 (실전 예제 포함) | exit() abort() 함수 사용 방법

C언어에서 프로그램을 종료하는 방법에는 여러가지가 있다.

exit(), abort(), _Exit() 함수가 그것이다. 비슷해 보이지만 내부적으로 동작하는 구조는 다르다.

종료의 목적은 여러가지가 있지만, 치명적인 오류로 비정상 동작하는 프로그램를 강제로 종료시킬 수 있으며, 정상적인 종료인 경우 OS에 상태 코드를 포함하여 종료 상태를 전달할 수 있다.

C언어 exit() 함수 종류와 사용 방법
C언어 exit() 함수 종류와 사용 방법

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() 함수는 프로그램을 종료하면서 운영체제에 종료 상태 코드를 전달한다.

일반적으로 exit(0)은 정상 종료를 의미하며, exit(1) 이상은 비정상 종료로 해석된다.

중요한 점은 exit()가 단순히 종료만 하는 것이 아니라, 표준 출력 버퍼를 flush하고, atexit()에 등록된 함수들을 실행한 뒤 종료한다는 점이다.

따라서 정상적인 종료 흐름에서는 exit()를 사용하는 것이 안전하다.

단, 즉시 중단이 필요한 상황이라면 _Exit()와의 차이를 이해해야 한다.

아래는 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() 함수를 만나는 순간 프로그램은 중단되며, 이후 코드는 실행되지 않는 것을 볼 수 있다.

종료 함수 exit() 실행결과
종료 함수 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에 전달했기 때문이며, 코드 자체로는 정상이다.

종료 함수 / abort() 실행 결과
종료 함수 / abort() 실행 결과

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에 요청하는 점에 주목하자.

종료함수 / _Exit() 실행결과
종료함수 / _Exit() 실행결과

댓글

파이썬 시작 문자열 출력문 print | 그놈의 Hello World

이미지
코딩을 위한 프로그램 언어를 공부하면 처음 만나는 것이 `Hello World`이다. 이 간단한 문장으로 프로그램 언어를 접하면서 코드를 작성하고 출력하는 과정을 알 수 있다. 파이썬에서 `Hello World`문장을 출력하는 것은 print 함수를 사용하면 된다. 비주얼 스튜디오 코드( Visual Studio Code )에서 파이썬 코드의 print 함수를 사용해 `hello world`를 출력해 본다. 파이썬 print / 문자열 출력 파이썬 문자열 출력 print 사용 방법 파이썬에서 문자열을 출력하는 방법은 print() 함수를 사용하는 것이다. 방법은 간단하며 아래와 같다. print("문자열") print(변수) 단순히 문자열을 화면에 출력할 때는 쌍따옴표( " ) 또는 작은 따옴표 ( ' )를 사용해 문자열을 입력하면 된다. 비주얼스튜디오코드에서 사용하기 파이썬에서 문자열을 출력하는 방법은 print 함수를 사용하는 것이다. 비주얼스튜디오코드( Visual Studio Code, 이하 VS Code )에서 파이썬의 print 함수를 사용하여 직접 문자열을 입력하고 출력해 보도록 한다. 순서는 다음과 같다. 비주얼 스튜디오 코드 실행. 파이썬 파일 생성. print 함수 작성 실행 ( 파일 선택 후 Ctrl + F5 ) 단계 진행하기 위의 과정을 하나씩 진행하며 파이썬의 print 함수를 이용해 문자열을 출력해 보자. 비주얼 스튜디오 코드 실행 먼저 비주얼 스튜디오 코드를 실행하여 파이썬 코드를 작성하기 위한 준비를 한다. 비주얼 스튜디오 코드는 파이썬 뿐만 아니라 다양한 웹/앱을 만들 수 있는 무료 IDE 이기에 프로그램 언어를 공부하기에 필수적이다. 비주얼 스튜디오 코드를 실행하면 다음과 같은 화면이 나타날 것이다. 비주얼 스튜디오 코드 IDE 실행 모습 파이썬 파일 생성 Open Folder 를 사용해 임의의 폴더를 열면 위의 이미지와 같은 형태가 될 것이다. 파일도 없고 아무것도 없다. 파일을 하나 생성하자...