'프로세스 종료'에 해당되는 글 1건

  1. 2012.11.21 프로세스 종료 exit() _exit() atexit() 1
Linux/UNIX2012. 11. 21. 10:52

모든 프로세스는 자신의 부모로 반환하는 어떤 수인 exit 코드가 존재하고, 시작된 프로세스는 종료되기 마련이다. 모든 프로세스는 종료된다는 말이다. 일반적인 프로세스의 종료방법에는 두 가지가 있는데, 하나는 exit function호출을 통한 종료이고 다른 하나는 그 프로그램의 메인 함수의 리턴을 통한 종료이다. 추가로 프로세스는 어떤 시그널(abort()함수를 통한...)에 대한 응답으로써 비정상적으로 종료되기도 하는데 이곳에서는 정상적인 프로세스에 대해서만 다루기로 한다.


리눅스에서 exit가 들어간 함수는 보통 프로세스의 종료와 관련되어 있다.

exit()이라는 함수 하나만 존재한다면 이런 글을 쓰고 있지 않겠지만, 프로세스를 종료시키는 라이브러리 함수가 몇 가지 더 존재한다.


exit()    _exit()    atexit()

위의 함수는 함수 명에서 보듯 프로세스를 종료시키는 함수이지만, 약간의 차이점을 두고 프로세스를 종료시킨다.

이제 프로세스를 종료시키는 세 가지 방법을 살펴보도록 하자.


#include <stdlib.h>


void exit(int status);

모든 표준 입/출력 버퍼를 비운다. 즉, Cleanup Processing을 한다고 보면되는데, 파일과 같은 모든 스트림들을 닫고 출력버퍼의 내용을 디스크에 쓰고난 뒤에 커널(kernel)로 리턴되는 함수이다. int status는 프로세스의 리턴값(즉, 메인함수의 반환값)이라고 이해하면 되겠다.


#include <unistd.h>


void _exit(int status);

위에서 말한 Cleanup Processing을 수행하지 않고 바로 커널로 리턴한다. Cleanup Processing을 거치지 않기 때문에 지금 수행중인 작업과 이후의 작업에 대해서는 보장받지 못한다는 점이 있다.


위의 두 함수는 모두 프로세스를 정상적으로 종료시킨다.


#include <stdlib.h>


void atexit(void (*func)(void));


returns: 0 if OK, nonzero on error


exit handler를 등록하는 함수이다. 그러니까 프로그램이 종료될 때(exit()이 호출되었을 때) 수행하는 함수들을 등록하는 함수라고 보면 되는 것 이다.




Posted by twinjh