함수의 원형은 다음과 같다
atexit() | on_exit() |
---|---|
int atexit | int on_exit |
(void(*function)(void)); | (void(*function)(int, void*) void *arg); |
상세설명
POSIX에 의해 정의된다 | SunOS4에 의해 정의됨 |
---|---|
어떠한 매개변수도 없다 | 이벤트 넘버와 들어가야하는 매개변수, 즉 인자가 필요하다 |
결국 exit함수의 반환값은, 프로세스가 다 종료된 후에 인자를 받게 된다는 뜻이다
자, 이제 프로세스가 종료될때의 과정들을 어느정도 알아 보았다!
한번 _exit()을 뜯고 맛봐보자
PURPOSE | 현재 프로세스를 종료시킨다 |
---|---|
INCLUDE | #include <unistd.h>, #include <stdlib.h> |
USAGE | void_exit(int status) |
ARGS | status return value |
RETURNS | nothing |
SEE ALSO | atexit(3), exit(3), on_exit(3) |
여기서 얘기하는 init프로세스란 무엇일까?
운영체제 부팅 과정에서 가장 먼저 실행되는 프로세스이다!이게 무엇을 의미하느냐, 부모 프로세스가 종료되면 자식 프로세스들은 고아 프로세스(Orphan process)가 된다.
근데, 만약 부모프로세스를 가장 먼저 실행되는 프로세스인 init프로세스로 설정을 하게 된다면, orphan이 될 일이 없기에, 안정성과 지속성을 보장받을 수 있다!
만약 부모 프로세스가 wait 또는 waitpid를 실행하고 있다면, 그것(부모 프로세스)에게 알린다
SIGCHLD를 parent에게 보낸다
여기서 SIGCHILD란, POSIX시그널의 하나로, 자식프로세스의 종료 또는 중지를 부모 프로세스에게 알리는 시그널이다! 기본적으로는 무시되게 작업되어있다. 부모 프로세스가 자식 프로세스의 상태 변화를 실시간으로 감지
exec 패밀리는 유닉스와 유닉스 기반 운영 체제에서 제공되는 함수들의 그룹이다. exec은 "execute"의 줄임말로, 새로운 프로세스를 실행하는 데 사용된다.
exec 패밀리에는 다음과 같은 함수들이 포함되어 있다:
- execve(): 새로운 프로그램을 실행하고 새로운 프로세스 이미지를 로드합니다. 실행 파일의 경로와 인자들을 지정할 수 있습니다.
- execv(): execve()와 유사하지만, 실행 파일의 경로를 상대 경로로 지정할 수 있습니다.
- execvp(): execve()와 유사하지만, 실행 파일의 경로를 환경 변수 PATH에서 검색하여 찾아낼 수 있습니다.
- execl(): 인자들을 인자 목록으로 지정하여 실행 파일을 실행합니다.
- execlp(): execl()과 유사하지만, 실행 파일의 경로를 환경 변수 PATH에서 검색하여 찾아낼 수 있습니다.
exec 함수들은 현재 실행 중인 프로세스의 이미지를 새로운 프로그램으로 교체하며, 새로운 프로그램은 현재 프로세스의 컨텍스트를 상속받는다. 따라서 exec 함수를 사용하여 다른 프로그램을 실행하면 현재 프로세스가 종료되고 대상 프로그램이 실행된다. exec 함수는 프로세스 간의 프로그램 교체 및 새로운 환경에서의 실행을 가능하게 한다.
자, 지금까지 우리는 '쉘'이라는것이 어떻게 작동하는지 배웠다
그 중, 프로그램을 프로세스에서 실행시키는 방법에 대해 배웠다
전반적으로 정리를 해보자!