-
C/C++ atexit(3), on_exit(3)C,C++ & Linux 2020. 5. 22. 17:37728x90
함수 기능
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