본문 바로가기
컴퓨터공학기초 개념/시스템 프로그래밍

23. 프로세스 - 프로세스 종료(exit)

by devraphy 2021. 9. 17.

1. exit() 시스템 콜

- exit()은 프로세스를 종료할 때 사용하는 시스템 콜이다.

 

a) exit()의 원형

#include <stdlib.h>
void exit(int status);

- exit() 시스템 콜은 stdlib 라는 기본 라이브러리에 속해있는 함수다.

- exit()의 인자(parameter)는 상태를 나타내는 정수를 입력한다. 

 

 

b) exit() 함수를 사용하는 이유 

- exit() 함수는 프로세스의 수행과정에서 비정상적인 종료가 필요한 경우에 사용한다. 

- C언어 코딩을 하다보면 exit(0)함수 보다 return 0;을 입력하는 경우가 많다. 

- 그렇다면 return 0과 exit(0)함수의 차이는 무엇일까?

 

 

c) return 0 와 exit(0)의 차이점 

- main함수 내부에서의 exit(0) 과 return 0은 기능적 차이가 없다. 

- 하지만 main 함수를 벗어나서 생각해보면, 차이점이 존재한다.

 

▶ return 0; 

- return 0; 을 사용하면 해당 함수만 종료된다. 

- 예를 들어, main함수 내부에 return 0;이 있다면 main 함수만 종료되는 것이다. 

- main함수는 동작이 종료되지만 그 외의 다른 코드는 작동한다. 

- 그러므로 프로세스는 살아있는 상태를 유지한다. 

 

▶ exit(0)

- exit(0)은 exit()을 호출한 프로세스 자체를 종료시킨다.

- 그러므로 앞으로 실행해야 할 코드와는 상관없이, 해당 프로세스 자체가 종료된다.

 

▶ 결론

- C언어 실행파일을 보면 return 명령어 내부에 _start()라는 함수를 호출하게 되고,

- 그리고 _start()함수는 결국 exit() 함수를 호출한다. 

- 근본적으로 return 함수의 내부에서 exit()을 함수를 호출하지만, 적용되는 범위가 다른 것이다. 


2. exit() 시스템 콜의 주요동작

- 내부적으로 exit() 시스템 콜이 어떻게 동작하는지 알아보자. 

 

▶ atexit() 시스템 콜에 등록된 함수(= 프로세스 종료함수)가 실행된다. 

▶ 열려있는 모든 입출력 스트림 버퍼(stdin, stdout, stderr)가 삭제된다. 

▶ 프로세스가 오픈한 파일을 모두 닫는다.

▶ tmpfile() 함수(임시 파일 처리를 위한 함수)를 통해 생성한 임시파일을 삭제한다.

 

a) atexit() 시스템 콜

- 프로세스 종료시 실행될 함수를 등록해놓는 용도로 사용된다.

- 등록된 함수를 등록된 역순서대로 실행한다. 

 

 

b) atexit() 실습예제 

#include <stdlib.h>
#include <stdio.h>
int main(void) {
        void exithandling(void);  // 함수등록
        void goodbyemessage(void); // 함수등록 
        int ret;

        ret = atexit(exithandling); // atexit()에 함수를 등록함 
        if (ret != 0) perror("Error in atexit\n"); // atexit()에 함수등록이 안되면 에러

        ret = atexit(goodbyemessage);
        if (ret != 0) perror("Error in atexit\n");
        exit(EXIT_SUCCESS); // exit() 함수로 프로세스 종료 
}
void exithandling(void) { // 함수선언
        printf("exit handling\n");
}
void goodbyemessage(void) { // 함수선언
        printf("see you again!\n");
}

- 위의 코드에서 중점적으로 봐야할 것은 함수의 등록 순서이다. 

- exithandling() 함수가 먼저, 그 다음에 goodbyemessage() 함수가 atexit()에 등록되었다.  

- 함수 등록순서의 역순으로 실행한다고 했으니까 goodbyemessage() 함수가 먼저 실행되어야 한다. 

- 실제로 실행시켜서 확인해보자. 

 

 

c) 실습예제 출력결과 

- 실제로 함수 등록순서의 역순으로 실행되었다. 

- 예상했던 것 처럼 goodbyemessage() 함수가 먼저 실행되었다.

댓글