Fonction atexit

Entête à inclure

#include <stdlib.h>  // <cstdlib> en C++

Fonction atexit

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

Permet d'ajouter une fonction qui sera exécutée en sortie du processus (du programme) en cours. Cette fonction sera quasiment systématiquement invoquée quelque soit la manière de sortir du processus considéré.

La seule possibilité pour que la fonction ne soit pas invoquée est que le processus soit mis à mort par l'ordonnanceur de tâches. Effectivement, pour contrôller un processus on lui envoie un signal. Cela peut se faire, sur les plates-formes Unix/Linux, via la commande système kill. Deux signaux disctincts, SIG_TERM (code 15) et SIG_KILL (code 9), peuvent permettrent de terminer un processus. SIG_TERM est envoyé au processus pour lui demander de bien vouloir se terminer : dans ce cas une fonction de sortie ajoutée via atexit sera bien invoquée. Par contre, si vous utilisez le signal SIG_KILL, celui-ci ne sera pas envoyé au processus, mais bien à l'ordonnanceur de tâches : dans ce cas le processus sera immédiatement mis à mort et une fonction de sortie ajoutée via atexit ne sera pas invoquée. A titre d'information, vous pouvez utiliser la commande suivante pour obtenir les autres signaux supportés par votre système :

$> kill -l

Note : il est possible d'utiliser cette fonction plusieurs fois, et donc d'ajouter plusieurs functions à exécuter en sortie du processus. Dans un tel cas, les fonctions seront invoquées dans l'ordre inverse de celui d'ajout des ces fonctions.

Paramètres

  • function: un pointeur sur la fonction à exécuter lors de la sortie du processus.

Valeur de retour

La valeur 0 est revoyée si la fonction est correctement ajoutée. Une valeur non nulle est renvoyée dans le cas inverse.

Exemple de code

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

void firstFunction() {
    printf( "firstFunction\n" );
}

void secondFunction() {
    printf( "secondFunction\n" );
}

int main() {
    
    int cr = atexit( firstFunction );
    assert( cr == 0 );

    cr = atexit( secondFunction );
    assert( cr == 0 );
    
    printf( "main finished\n" );

    /* Results are :
        main finished
        secondFunction
        firstFunction
    */

    return 0;
}

Sujets connexes