SETJMP |
Fixe le saut |
---|---|
Langage C | setjmp.h |
Syntaxe
int setjmp(jmp_buf env); |
Paramètres
Nom | Description |
---|---|
env | Ce paramètre permet d'indiquer l'environnement contenant l'expression à traiter |
Description
Cette fonction effectue la sauvegarde de la pile.
Algorithme
MODULE SETJMP(env) * Sauvegarder l'état d'exécution courant du programme * Cela inclut le pointeur d'instruction, le registre,... store_execution_state_in(env) * Valeur de retour pour le premier passage dans setjmp RETOURNE 0 |
Remarques
- Utilisation avec longjmp : La fonction setjmp fonctionne conjointement avec longjmp. Lorsque setjmp est appelée, elle enregistre l'état actuel du programme et renvoie 0. Si plus tard, longjmp est appelé avec le même env, l'exécution revient à l'endroit où setjmp a été appelé, mais cette fois-ci, setjmp retourne un non-zéro pour indiquer que l'exécution a été reprise via longjmp.
- Gestion des exceptions et des erreurs : setjmp et longjmp sont souvent utilisés pour implémenter une forme de gestion des erreurs ou des exceptions dans des langages comme le C, ne disposant pas de mécanismes d'exceptions intégrés. Cela permet de sortir rapidement d'une fonction en cas d'erreur, tout en restaurant l'état du programme à un point sécurisé.
- Retour non-nul de setjmp après longjmp : Lorsque longjmp est appelé, l'exécution du programme revient au point où setjmp a été appelé, mais cette fois-ci, setjmp retourne une valeur différente de zéro. Cela permet de différencier un retour normal de la fonction setjmp (renvoyant 0) et un retour après un appel à longjmp (renvoyant une valeur non nulle).
- Restrictions et Limitations : setjmp et longjmp sont puissantes, mais leur utilisation est délicate. Par exemple, elles ne sont pas sûres à utiliser dans des environnements multi-processus légers où elles peuvent interférer avec les piles des processus légers. De plus, elles peuvent ne pas restaurer correctement l'état des variables locales ou des ressources si elles sont modifiées après le point de sauvegarde.
- Non-Support des variables locales modifiées : Lorsqu'une fonction avec setjmp et longjmp est appelée, les variables locales de cette fonction sont généralement laissées dans un état indéfini, sauf si elles sont marquées comme volatile. setjmp ne gère pas le nettoyage automatique de ces variables, et leur utilisation après un longjmp pourrait conduire à des comportements imprévisibles.
- Utilisation de jmp_buf : Le type jmp_buf, utilisé par setjmp, est une structure spéciale contenant les informations nécessaires pour restaurer l'état d'exécution lors d'un appel à longjmp. Le contenu exact de cette structure est dépendant de l'implémentation du compilateur et de l'architecture matérielle, mais elle contient généralement des informations sur la pile et les registres du microprocesseur.
- Impact sur la portabilité : Bien que setjmp et longjmp soient des fonctions standard du langage C, leur comportement peut varier légèrement d'un compilateur à un autre. De plus, elles sont souvent considérées comme des techniques "non recommandées" dans les projets modernes en raison de leur complexité et de leur potentiel à introduire des erreurs difficiles à traquer, notamment dans des environnements multi-processus léger ou lors de l'utilisation de ressources externes.
Exemple
Voici un exemple permettant de sauvegarder l'environnement de façon à ce qu'il passe deux fois sur le même code :
Essayer maintenant !
on obtiendra le résultat suivant :
Appeler setjmpLongjmp est appelé
Voir également
Langage de programmation - C - Référence de procédures et fonctions - longjmp
Langage de programmation - C - Référence de procédures et fonctions - signal
Langage de programmation - C++ - Référence de procédures et fonctions - setjmp
Références
Langage C, Edition Micro-Application, Gehard Willms, 2001, ISBN: 2-7429-2008-0, page 734.
Borland C++ for Windows 4.0, Library Reference, Edition Borland, 1993, Part # BCP1240WW21772, page 231.
Dernière mise à jour : Mardi, le 28 juillet 2015