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() 함수가 먼저 실행되었다.
'컴퓨터공학기초 개념 > 시스템 프로그래밍' 카테고리의 다른 글
25. 프로세스 - 우선순위 스케줄링 시스템 콜 (0) | 2021.09.17 |
---|---|
24. 프로세스 - 프로세스 생성과 종료 총정리 (0) | 2021.09.17 |
22. 프로세스 - copy on write (0) | 2021.09.16 |
21. 프로세스 - wait & 쉘 만들기 (0) | 2021.09.16 |
20. 프로세스 - 프로세스 생성(exec) (0) | 2021.09.15 |
댓글