File: at-exit.c

#include "stdio.h"
#include "stdlib.h"
#include "unistd.h"
 
/* definiamo questa macro per gestire in modo compatto gli errori: la metteremo,
 * insieme ad altre, nella libreria ufficiosa `misc.h` */
#define exit_with_sys_err(s)                                                   \
    {                                                                          \
        perror((s));                                                           \
        exit(EXIT_FAILURE);                                                    \
    }
 
void my_exit1(void) { printf("primo handler di uscita attivato!\n"); }
void my_exit2(void) { printf("secondo handler di uscita attivato!\n"); }
 
int main(int argc, char *argv[]) {
    printf("avvio del programma...\n");
 
    // programmiamo gli handler di uscita
    if (atexit(my_exit2) != 0) {
        // gestione standard degli errori: da ora in poi useremo la macro
        perror("my_exit2");
        exit(EXIT_FAILURE);
    }
    if (atexit(my_exit1) != 0)
        exit_with_sys_err("my_exit1");
    if (atexit(my_exit1) != 0)
        exit_with_sys_err("my_exit1");
 
    printf("aspetto un po'...\n");
    sleep(3);
 
    printf("chiudo il processo...\n");
 
    exit(EXIT_SUCCESS); // gli handler vengono eseguiti automaticamente
}