Hàm atexit() đăng ký hàm sẽ được gọi khi chương trình kết thúc bình thường (gọi exit() hoặc return từ main). Hàm đăng ký không tham số. Khai báo trong <stdlib.h>.
Cú pháp
int atexit(void (*func)(void));
Trả về 0 nếu thành công, khác 0 nếu lỗi (hết slot đăng ký).
Ví dụ
#include <stdio.h>
#include <stdlib.h>
void func1(void) { printf("\nThoat ham 1"); }
void func2(void) { printf("\nThoat ham 2"); }
int main() {
atexit(func1);
printf("\nBat dau main()");
atexit(func2);
printf("\nKet thuc main()");
return 0;
}
Kết quả
Bat dau main()
Ket thuc main()
Thoat ham 2
Thoat ham 1
Giải thích: Các hàm đăng ký qua atexit được gọi theo thứ tự LIFO (Last In First Out) – hàm đăng ký sau chạy trước. Chúng chạy sau khi main kết thúc (trước khi process exit).
Ứng dụng
- Cleanup tài nguyên toàn cục (đóng log, ghi config, giải phóng shared memory).
- Đảm bảo code chạy khi thoát bình thường từ nhiều điểm khác nhau.
Lưu ý:
atexit không được gọi nếu chương trình kết thúc bởi _Exit(), abort(), hoặc crash (signal không bắt). Giới hạn số hàm đăng ký (thường 32-200 tùy implementation).