Recommanded Free YOUTUBE Lecture: <% selectedImage[1] %>

exit(3)

1장. exit(3)

차례
1.1. 사용법
1.2. 설명
1.3. 반환값
1.4. 주목
1.5. 예제
1.6. 참고문헌

프로그램을 정상 종료 시킨다.


1.1. 사용법

#include <stdlib.h>

void exit(int status);
		


1.2. 설명

exit()함수는 프로그램을 정상종료 시키며, 이때 종료 값으로 status를 부모프로세스에 status & 0377 로넘겨준다. 부모 프로세스는 wait(2)를 이용해서 자식 프로세스의 종료값을 읽어 올 수 있다. exit()가 호출되면 atexit()와 on_exit()에 의해서 등록된 함수들이 먼저 실행된다. 그 후 모든 열린 스트림을 비우고(flush) 닫는다. tmpfile()에 의해서 생성된 임시파일도 이때 삭제된다.

표준 C에서는 exit()의 종료값을 위해서 EXIT_SUCCESSEXIT_FAILURE를 준비해두고 있다.


1.3. 반환값

아무것도 리턴하지 않는다.


1.4. 주목

exit가 진행되는 동안 atexit()와 on_exit()에 의해서 등록된 함수들이 있다면 이들을 모두 실행한다. 등록된 함수들은 (스택형태로) 가장 마지막에 등록된 함수를 가져와서 실행된다. 만약 exit 과정중에 longjmp()등이 호출된다면 어떠한 일이 일어날지 예측할 수 없다.

EXIT_SUCCESS 와 EXIT_FAILURE 는 종료값을 간단하고 명확하게 결정하기 위해서 사용한다. EXIT_SUCCESS는 프로그램이 주어진 일을 정상적으로 수행했음을 EXIT_FAILURE는 정상적으로 수행하지 않았음을 알려주기 위해서 사용한다. 물론 프로그램에 따라서 다양한 종료값을 리턴할 수도 있으며, 이것은 프로그램개발자의 정책에 의존적이 된다. 보통 0을 정상 수행, 그렇지 않은 경우를 비정상 수행(에러)로 정의한다.

exit()가 수행되면서 발생한 상태값은 반드시 부모에게 전달되어져야 한다. 여기에는 두 가지 경우가 있는데, 부모가 SA_NOCLDWAIT 상태이거나, SIGCHLD 시그널에 대해서 시그널 핸들러를 SIG_IGN으로 지정했다면 종료값을 버리게 된다. 만약 부모가 wait()함수등을 이용해서 자식의 종료를 기다리게 되면 부모는 자식의 종료값을 얻을 수 있게 된다. 어느 쪽을 선택하든지 간에 자식 프로세스는 즉각 종료하는데, 만약 부모가 SA_NOCLDWAIT이거나 SIGCHLD에 대해 SIG_IGN하지 않은 상태에서 즉 자식의 종료를 기다리겠다고 명시한 상태에서 wait()를 하지 않았을 경우 자식 프로세스는 좀비(zombie)프로세스 상태가 된다. 좀비 프로세스에 대한 자세한 내용은 좀비 프로세스에 대한 고찰을 참고하기 바란다.

만약 SIGCHLD 시그널을 지원하도록 signal()설정을 했다면 자식 프로세스가 종료했을 때 SIGCHLD 시그널이 부모에게 보내어진다. 만약 SA_NOCLDWAIT로 설정되어 있다면 SIGCHLD 시그널이 전달되었을 때 어떤 일이 일어 날지 예측 할수 없다.

만약 종료되는 프로세스가 세션 리더이고 세션과 자신의 터미널을 제어하고 있다면, 이 터미널을 사용하는 foreground 프로세스에게는 SIGHUP시그널이 전달되고 세션과 터미널의 연결이 해제된다.


1.5. 예제

#include <unistd.h>
#include <string.h>
#include <stdio.h>
#include <sys/types.h>
#include <sys/wait.h>


int main()
{
    int pid;
    int status;
    int spid;
    pid = fork();

    if (pid == 0)
    {
        sleep(5);
        printf("I will be back %d\n", getpid());
        return 1;
    }

    else if(pid > 0)
    {
        printf("Im parent %d\n", getpid());
        printf("Press any key and wait\n");
        getchar();
        // 자식프로세스를 wait 한다.
        // 자식프로세스의 종료상태는 status 를 통해 받아온다.
        spid = wait(&status);
        printf("자식프로세스 wait 성공 \n");
        // 자식프로세스의 PID, 리턴값, 종료상태(정상종료혹은 비정상종료)를
        // 얻어온다.
        printf("PID         : %d\n", spid);
        printf("Exit Value  : %d\n", WEXITSTATUS(status));
        printf("Exit Stat   : %d\n", WIFEXITED(status));
    }
    else
    {
        perror("fork error :");
    }
}