ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • C/C++ atexit(3), on_exit(3)
    C,C++ & Linux 2020. 5. 22. 17:37
    728x90

    함수 기능

    exit() 함수가 실행될 때 자동으로 실행될 함수들을 등록하는 함수입니다.

    위 함수들로 등록된 함수들을 Stack 으로 쌓이며 늦게 등록된 함수일수록 먼저 호출됩니다.

     

    atexit() 함수의 경우에는 리턴 타입과 인자가 없는 함수만을 등록 할 수 있습니다.

    on_exit() 함수의 경우에는 리턴 타입은 없으나 인자를 가질 수 있는 함수를 등록할 수 있습니다.

     

    위 함수들로 등록된 함수들은 정상적인 프로세스 종료시에 순차적으로 실행됩니다.

    즉 시그널을 받고 종료되는 프로세스에 대해서는 등록된 함수들이 실행되지 않습니다.

     

    위 함수들로 등록된 함수들은 exit() 함수를 호출해선 안됩니다. 무한 재귀 함수호출에 빠질 수 있습니다.

    무한 재귀 함수호출에서 빠져나오기 위해서는 _exit() 함수를 호출해야합니다.

     

    함수 원형

    #include <stdlib.h>
    
    int atexit(void (*__func__)(void));
    int on_exit(void (*function)(int, void*), void *arg);

     

    매개변수

    __func__

    등록할 함수 포인터

     

    function

    등록할 함수 포인터

    해당 함수의 int 형 파라미터에는 exit() 함수의 status 또는 main() 함수의 return 값이 넘어갑니다.

    void * 형 파라미터에는 arg 가 넘어갑니다.

     

    arg

    함수 포인터에 넘길 파라미터

    반환값

    성공 시 0 리턴

    에러 시 0 이 아닌 정수 리턴

    예제

    #include <stdio.h>
    #include <stdlib.h>
    #include <unistd.h>
    #include <memory.h>
    
    void ssu_exit1() {
        printf("ssu_exit1\n");
    }
    
    void ssu_exit2() {
        printf("ssu_exit2\n");
    }
    
    int main(int argc, char *argv[]) {
    	
    	// ssu_exit2
        if (atexit(ssu_exit2)) {
            fprintf(stderr, "atexit error\n");
            exit(1);
        }
    
    	// ssu_exit1
        if (atexit(ssu_exit1)) {
            fprintf(stderr, "atexit error\n");
            exit(1);
        }
    
        printf("끝\n");
    
    	// ssu_exit1 이 먼저 실행됨
    	// ssu_exit2 가 나중에 실행
        exit(0);
    }
    

     

    결과

     

     

     

     

     

     

     

     

     

     

    리눅스시스템프로그래밍 저자 : 홍지만
    https://book.naver.com/bookdb/book_detail.nhn?bid=14623672

    책에 기술된 예제 프로그램입니다. 책 내부에는 훨씬 더 많은 자료가 있습니다. (개인적으로 좋았습니다.)

    'C,C++ & Linux' 카테고리의 다른 글

    C/C++ calloc(3)  (0) 2020.05.22
    C/C++ malloc(3)  (0) 2020.05.22
    C/C++ exit(3) _exit(2) _Exit(2)  (0) 2020.05.22
    C/C++ tempnam(3)  (0) 2020.05.22
    C/C++ tmpnam(3), tmpfile(3)  (0) 2020.05.22

    댓글

Designed by Tistory.