NAME

atexit - 프로세스 정상 종료 때 호출되는 함수 등록하기

SYNOPSIS

#include <stdlib.h>

int atexit(void (*function)(void));

DESCRIPTION

atexit() 함수는 exit(3)나 프로그램 main() 반환을 통한 프로세스 정상 종료 때 호출하도록 주어진 함수 function을 등록해 둔다. 그렇게 등록된 함수들은 등록 순서의 역순으로 호출된다. 어떤 인자도 전달되지 않는다.

같은 함수를 여러 번 등록할 수도 있다. 각 등록마다 한 번씩 호출된다.

POSIX.1에서는 구현에서 그런 함수들을 최소 ATEXIT_MAX(32) 개 등록할 수 있어야 한다고 요구한다. 구현체에서 지원하는 실제 제한치를 sysconf(3)를 써서 얻을 수 있다.

fork(2)를 통해 자식 프로세스가 생성되면 부모의 등록 내용 사본을 물려받는다. exec(3) 함수들 중 하나를 성공적으로 호출하면 모든 등록 내용이 없어진다.

RETURN VALUE

atexit() 함수는 성공 시 0 값을 반환한다. 그 외의 경우 0 아닌 값을 반환한다.

ATTRIBUTES

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

인터페이스 속성
atexit() 스레드 안전성 MT-Safe

CONFORMING TO

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

NOTES

시그널 전달로 인해 프로세스가 비정상 종료하는 경우 atexit()로 (그리고 on_exit(3)로) 등록된 함수들이 호출되지 않는다.

등록된 함수에서 _exit(2)를 호출하는 경우 남은 함수들이 호출되지 않으며 exit(3)가 수행하는 나머지 프로세스 종료 단계들이 수행되지 않는다.

POSIX.1에서는 exit(3) 중복 호출의 (즉 atexit()로 등록된 함수 안에서 exit(3)를 호출하는 것의) 결과가 규정돼 있지 않다고 말한다. 어떤 시스템에서는 (리눅스에서는 아님) 이 때문에 무한 재귀가 발생할 수 있다. 이식 가능한 프로그램에서는 atexit()로 등록하는 함수 안에서 exit(3)를 부르지 말아야 한다.

atexit() 함수와 on_exit(3) 함수는 같은 목록에 함수를 등록한다. 프로세스 정상 종료 시 이 두 함수로 등록했던 역순으로 등록 함수들이 호출된다.

POSIX.1에 따르면 atexit()로 등록한 함수의 실행을 longjmp(3)로 종료한 경우 그 결과가 규정돼 있지 않다.

리눅스 참고 사항

glibc 2.2.3부터 공유 라이브러리 내에서 atexit()를 (그리고 on_exit(3)를) 사용해 그 공유 라이브러리가 내려갈 때 호출될 함수를 설정할 수 있다.

EXAMPLES

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

void
bye(void)
{
    printf("That was all, folks\n");
}

int
main(void)
{
    long a;
    int i;

    a = sysconf(_SC_ATEXIT_MAX);
    printf("ATEXIT_MAX = %ld\n", a);

    i = atexit(bye);
    if (i != 0) {
        fprintf(stderr, "cannot set exit function\n");
        exit(EXIT_FAILURE);
    }

    exit(EXIT_SUCCESS);
}

SEE ALSO

_exit(2), dlopen(3), exit(3), on_exit(3)


2021-03-22