NAME

exit - 정상적 프로세스 종료 일으키기

SYNOPSIS

#include <stdlib.h>

noreturn void exit(int status);

DESCRIPTION

exit() 함수는 정상적 프로세스 종료를 일으키며 status의 최하위 바이트(status & 0xFF)가 부모에게 반환된다. (wait(2) 참고.)

atexit(3)on_exit(3)로 등록한 모든 함수들이 등록 역순으로 호출된다. (그 함수들에서 atexit(3)on_exit(3)를 사용해 종료 중 실행할 함수를 추가로 등록하는 게 가능하다. 새로 등록한 함수는 호출을 기다리는 함수들의 목록 선두에 추가된다.) 그 함수들 중 하나가 반환하지 않으면 (가령 _exit(2)를 호출하거나 시그널로 스스로를 죽이면) 나머지 함수들이 호출되지 않으며 이후 종료 절차를 (특히 stdio(3) 스트림 플러싱을) 포기한다. 한 함수를 atexit(3)이나 on_exit(3)으로 여러 번 등록했으면 등록 횟수만큼 호출된다.

열린 stdio(3) 스트림들을 모두 플러시하고 닫는다. tmpfile(3)로 만든 파일들을 제거한다.

C 표준에서 상수 EXIT_SUCCESSEXIT_FAILURE를 명세하는데, 이를 exit()에게 전달하여 각각 성공 종료나 성공 아닌 종료를 나타낼 수 있다.

RETURN VALUE

exit() 함수는 반환하지 않는다.

ATTRIBUTES

이 절에서 사용하는 용어들에 대한 설명은 attributes(7)를 보라.

인터페이스 속성
exit() 스레드 안전성 MT-Unsafe race:exit

exit() 함수는 보호가 이뤄지지 않는 전역 변수를 사용하며, 따라서 스레드에 안전하지 않다.

CONFORMING TO

POSIX.1-2001, POSIX.1-2008, C89, C99, SVr4, 4.3BSD.

NOTES

atexit(3)on_exit(3)으로 등록한 함수에서 exit()longjmp(3)를 호출한 경우의 동작 방식은 규정돼 있지 않다. 참고로 execve(2)를 호출하면 atexit(3)on_exit(3)으로 등록한 내용이 없어진다.

EXIT_SUCCESSEXIT_FAILURE를 쓰는 것이 0과 1 또는 -1 같은 값을 쓰는 것보다 (비 유닉스 환경에 대해) 조금 더 이식성이 있다. 특히 VMS에서 다른 관행을 사용한다.

BSD에서 종료 코드를 표준화하려 하고 있다. (GNU C 라이브러리 같은 몇몇 C 라이브러리에서도 받아들였다.) <sysexits.h> 파일 참고.

exit() 후에 종료 상태가 부모 프로세스에게 전달되어야 한다. 세 가지 경우가 있다.

구현에서 SIGCHLD 시그널을 지원하면 부모에게 그 시그널이 전송된다. 부모에서 SA_NOCLDWAIT을 설정한 경우에 SIGCHLD 시그널이 전송되는지 여부는 규정돼 있지 않다.

다른 프로세스에게 전송되는 시그널

종료하는 프로세스가 세션 리더이고 그 제어 터미널이 세션의 제어 터미널인 경우에는 그 제어 터미널의 전경 프로세스 그룹의 각 프로세스에게 SIGHUP 시그널이 전송되며 터미널이 그 세션과 분리된다. 그래서 새로운 제어 프로세스가 터미널을 획득할 수 있게 된다.

프로세스 종료로 인해 어떤 프로세스 그룹이 고아가 되는 경우에 새로 고아가 되는 그 프로세스 그룹의 구성원 중에 정지된 프로세스가 있으면 그 프로세스 그룹의 각 프로세스에게 SIGCONT 시그널과 SIGHUP 시그널이 연달아 가게 된다. 고아 프로세스 그룹에 대한 설명은 setpgid(2)를 보라.

위 경우들에선 시그널을 받는 프로세스가 종료 프로세스의 자식일 수도 있다. 하지만 이를 제외하면 일반적으로 프로세스 종료로 인해 그 프로세스의 자식에게 시그널이 전송되지 않는다. 하지만 프로세스에서 prctl(2) PR_SET_PDEATHSIG 동작을 사용해 자기 부모가 종료하는 경우 시그널을 받도록 바꿀 수 있다.

SEE ALSO

_exit(2), get_robust_list(2), getpgid(2), wait(2), atexit(3), on_exit(3), tmpfile(3)


2021-03-22