Participer au site avec un Tip
Rechercher
 

Améliorations / Corrections

Vous avez des améliorations (ou des corrections) à proposer pour ce document : je vous remerçie par avance de m'en faire part, cela m'aide à améliorer le site.

Emplacement :

Description des améliorations :

Vous êtes un professionnel et vous avez besoin d'une formation ? Programmation avec
Le langage C
Voir le programme détaillé

La librairie <setjmp.h> (<csetjmp> en C++)

Le type jmp_buf


Accès rapide :
Présentation de l'entête <setjmp.h>
Exemple d'utilisation
Eléments C ISO
Extensions POSIX

Présentation de l'entête <setjmp.h>

La librairie <setjmp.h> propose un mécanisme de saut non local. Elle permet de sauvegarder un point d'exécution avec setjmp, puis d'y revenir plus tard avec longjmp, même si plusieurs appels de fonctions ont été franchis entre-temps.

Cette possibilité peut être utile pour sortir rapidement d'une séquence d'appels imbriqués, par exemple en cas d'erreur difficile à traiter localement. Il faut toutefois l'utiliser avec prudence : un saut non local ne ferme pas automatiquement les fichiers, ne libère pas les blocs mémoire alloués et ne remplace pas une gestion d'erreur structurée.

Pour utiliser les éléments proposés par cette librairie, il suffit d'inclure l'entête suivant.

#include <setjmp.h>

Exemple d'utilisation

L'exemple suivant sauvegarde un point de reprise dans main. Une fonction plus profonde détecte ensuite une erreur et revient directement à ce point avec longjmp.

 1 
 2 
 3 
 4 
 5 
 6 
 7 
 8 
 9 
 10 
 11 
 12 
 13 
 14 
 15 
 16 
 17 
 18 
 19 
 20 
 21 
 22 
 23 
 24 
 25 
 26 
 27 
 28 
 29 
#include <setjmp.h>
#include <stdio.h>
#include <stdlib.h>

static jmp_buf recoveryPoint;

static void loadModule( int id ) {

    if ( id == 2 ) {
        longjmp( recoveryPoint, id );
    }

    printf( "Module %d chargé.\n", id );
}

int main() {

    int errorCode = setjmp( recoveryPoint );

    if ( errorCode == 0 ) {
        loadModule( 1 );
        loadModule( 2 );
        puts( "Fin normale." );
    } else {
        printf( "Erreur détectée dans le module %d.\n", errorCode );
    }

    return EXIT_SUCCESS;
}
Exemple d'utilisation de setjmp.h

Cet exemple produit le résultat suivant.

Module 1 chargé.
Erreur détectée dans le module 2.

Eléments C ISO

Nom Type Description Depuis
jmp_buf type Type tableau capable de conserver les informations nécessaires à un saut non local. C89
longjmp fonction Restaure l'environnement précédemment sauvegardé par setjmp. C89
setjmp macro Sauvegarde l'environnement courant afin de permettre un retour ultérieur avec longjmp. C89
__STDC_VERSION_SETJMP_H__ macro Macro de version de l'entête <setjmp.h>. C23

Extensions POSIX

POSIX complète cet entête avec des variantes capables de sauvegarder et de restaurer le masque des signaux bloqués. Ces éléments sont utiles quand un saut non local est déclenché depuis une logique liée aux signaux.

Nom Type Description Depuis
sigjmp_buf type Type tableau utilisé par les variantes POSIX de sauvegarde d'environnement. POSIX
siglongjmp fonction Restaure un environnement sauvegardé par sigsetjmp. POSIX
sigsetjmp macro ou fonction Sauvegarde l'environnement courant et, si demandé, le masque des signaux bloqués. POSIX
Les anciennes interfaces POSIX _setjmp et _longjmp ne sont pas documentées ici : elles ne font plus partie de POSIX Issue 8.


Le type jmp_buf




Vous êtes un professionnel et vous avez besoin d'une formation ? Programmation avec
Le langage C
Voir le programme détaillé