dwww Home | Manual pages | Find package

setjmp(3)                  Library Functions Manual                  setjmp(3)

NOM
       setjmp, sigsetjmp, longjmp, siglongjmp - Effectuer un saut non local

BIBLIOTHÈQUE
       Bibliothèque C standard (libc, -lc)

SYNOPSIS
       #include <setjmp.h>

       int setjmp(jmp_buf env);
       int sigsetjmp(sigjmp_buf env, int sauvsigs);

       [[noreturn]] void longjmp(jmp_buf env, int val);
       [[noreturn]] void siglongjmp(sigjmp_buf env, int val);

   Exigences  de  macros  de  test de fonctionnalités pour la glibc (consulter
   feature_test_macros(7)) :

       setjmp() : consultez la section NOTES.

       sigsetjmp():
           _POSIX_C_SOURCE

DESCRIPTION
       Les fonctions décrites dans cette page sont  utilisées  pour  effectuer
       des « sauts non locaux » : transfert de l'exécution d'une fonction à un
       emplacement prédéterminé d'une autre  fonction.  La  fonction  setjmp()
       établit  de  façon dynamique l'emplacement vers lequel le contrôle sera
       transféré ultérieurement et longjmp() se charge de transférer  l'exécu-
       tion.

       La  fonction setjmp() sauvegarde diverses informations concernant l'en-
       vironnement de l'appelant (typiquement le pointeur de pile, le pointeur
       d'instruction, potentiellement les valeurs d'autres registres ainsi que
       le masque de signaux) dans le tampon env  pour  son  utilisation  ulté-
       rieure par longjmp(). Dans ce cas, setjmp() renvoie 0.

       La  fonction  longjmp() utilise les informations stockées dans env pour
       transférer le contrôle à l'endroit où setjmp() fut appelé et  restaurer
       (« rewind ») la pile à son état lors de l'appel à setjmp(). De plus, et
       en fonction de l'implémentation (voir NOTES), les valeurs d'autres  re-
       gistres  et  le  masque  de signaux du processus peuvent également être
       restaurées à leur état lors de l'appel à setjmp().

       Après un appel réussi à longjmp(), l'exécution continue comme  si  set-
       jmp()  avait renvoyé une deuxième fois. Ce renvoi « factice » peut être
       distingué d'un vrai appel à setjmp() car il renvoie la valeur  contenue
       dans  val.  Si le programmeur passe la valeur 0 à val par inadvertance,
       le renvoi « factice » retourne 1 à la place.

   sigsetjmp() et siglongjmp()
       sigsetjmp() et siglongjmp() effectuent également des sauts  non  locaux
       mais  permettent une gestion prévisible du masque de signaux du proces-
       sus.

       Si, et seulement si, l'argument sauvsigs passé à  sigsetjmp()  est  non
       nul,  le  masque de signaux actuel du processus est sauvegardé dans env
       et sera rétabli lorsque siglongjmp() sera  invoquée  avec  ce  contexte
       env.

VALEUR RENVOYÉE
       setjmp() et sigsetjmp() renvoient 0 lorsqu'elles sont appelées directe-
       ment ; la valeur non nulle spécifiée dans val est renvoyée lors du ren-
       voi  « factice »  qui se produit après un appel à longjmp() ou siglong-
       jmp().

       Les fonctions longjmp() et siglongjmp() ne renvoient pas.

ATTRIBUTS
       Pour une explication des termes utilisés dans cette section,  consulter
       attributes(7).

       ┌─────────────────────────────────────┬──────────────────────┬─────────┐
       │InterfaceAttributValeur  │
       ├─────────────────────────────────────┼──────────────────────┼─────────┤
       │setjmp(), sigsetjmp()                │ Sécurité des threads │ MT-Safe │
       ├─────────────────────────────────────┼──────────────────────┼─────────┤
       │longjmp(), siglongjmp()              │ Sécurité des threads │ MT-Safe │
       └─────────────────────────────────────┴──────────────────────┴─────────┘

STANDARDS
       setjmp(), longjmp() : POSIX.1-2001, POSIX.1-2008, C99.

       sigsetjmp(), siglongjmp() : POSIX.1-2001, POSIX.1-2008.

NOTES
       POSIX ne spécifie pas si setjmp() sauve le masque de signaux (pour être
       ensuite restauré lors de longjmp()). Sous System V,  ce  n'est  pas  le
       cas.  Sous  4.3BSD, le masque sera sauvé et il y a une fonction _setjmp
       qui ne fait pas la copie. Le comportement sous Linux dépend de la  ver-
       sion  de  la  glibc ainsi que de la configuration des macros de test de
       fonctionnalités. Avant la glib 2.19, setjmp() suit le  comportement  de
       System V par défaut, mais le comportement BSD est fourni si la macro de
       test de fonctionnalités _BSD_SOURCE est définie et qu’aucune des macros
       _POSIX_SOURCE,    _POSIX_C_SOURCE,    _XOPEN_SOURCE,   _GNU_SOURCE   ou
       _SVID_SOURCE n'est définie. Depuis la glibc 2.19,  <setjmp.h>  n’expose
       que  la version System V de setjmp(). Les programmes ayant besoin de la
       sémantique BSD devraient remplacer les appels de setjmp() par  des  ap-
       pels de sigsetjmp() avec un argument sauvsigs non nul.

       setjmp()  et  longjmp() peuvent être utiles pour gérer des erreurs dans
       des appels profondément imbriqués ou pour permettre à  un  gestionnaire
       de  signal de passer le contrôle à un point précis du programme, plutôt
       que de renvoyer là où le gestionnaire a interrompu le programme princi-
       pal.  Dans ce dernier cas, si vous désirez sauvegarder et restaurer les
       masques de signaux de manière portable,  utilisez  sigsetjmp()  et  si-
       glongjmp().  Consultez  également la sous-section sur la lisibilité des
       programmes ci-dessous.

       Le compilateur peut optimiser certaines variables dans des registres et
       longjmp()  peut  restaurer  les  valeurs d'autres registres en plus des
       pointeurs de pile et d'instruction. Par conséquent, les valeurs de  va-
       riables  automatiques ne sont pas spécifiées après un appel à longjmp()
       si elles satisfont à tous les critères suivants :

       •  elles sont locales à la fonction qui a effectué  l'appel  correspon-
          dant à setjmp() ;

       •  leur valeur est changée entre les appels à setjmp() et longjmp() ;

       •  elles ne sont pas déclarées comme volatile.

       Ces remarques s'appliquent aussi à siglongjmp().

   Sauts non locaux et lisibilité des programmes
       Bien  que  la déclaration C traditionnelle « goto » puisse être exploi-
       tée, elle a pour bénéfice que les repères lexicaux (la  déclaration  de
       saut  ainsi  que l'étiquette cible) permettent au programmeur de perce-
       voir de façon claire le flux de contrôle. Les sauts non locaux ne four-
       nissent  pas de tels repères : plusieurs appels à setjmp() peuvent uti-
       liser la même variable jmp_buf de telle sorte que son contenu change au
       cours  du  déroulement de l'application. Par conséquent, le programmeur
       peut être astreint à une lecture détaillée du code afin  de  déterminer
       la  cible  dynamique  d'un  appel longjmp() particulier (pour rendre la
       tâche du programmeur plus simple, chaque appel à setjmp() devrait  uti-
       liser une variable jmp_buf unique).

       De  façon  encore  plus  compliquée, les appels à setjmp() et longjmp()
       peuvent même provenir de modules de code source différents.

       En résumé, les sauts non locaux peuvent rendre les programmes plus dif-
       ficiles  à  comprendre  et à maintenir, et une alternative devrait être
       utilisée lorsque c'est possible.

   Mises en garde
       Si la fonction qui a appelé setjmp() renvoie  avant  que  longjmp()  ne
       soit appelée, le comportement n'est pas défini. Une sorte de chaos plus
       ou moins subtil en résulterait de façon certaine.

       Si, dans un programme à plusieurs fils d'exécution, un  appel  à  long-
       jmp()  utilise un tampon env initialisé préalablement par setjmp() dans
       un fil d'exécution différent, le comportement n'est pas défini.

       Le Technical Corrigendum 2 de POSIX.1-2008 ajoute longjmp() et siglong-
       jmp() à la liste des fonctions sûres vis-à-vis des signaux asynchrones.
       Cependant, la norme recommande de ne pas utiliser ces fonctions dans un
       gestionnaire de signal et indique ensuite que si ces fonctions sont ap-
       pelées depuis un gestionnaire de signal qui a interrompu un appel à une
       fonction  non sûre vis-à-vis des signaux asynchrones (ou similaire tels
       que les étapes équivalentes à exit(3) se produisant après un renvoi  de
       l'appel  initial  main()),  le comportement n'est pas défini si le pro-
       gramme fait par la suite un appel à une fonction non sûre vis-à-vis des
       signaux asynchrones. La seule façon d'éviter ce comportement non défini
       est de s'assurer de la chose suivante :

       •  Après un saut non local depuis un gestionnaire de  signal,  le  pro-
          gramme  n'appelle  pas  de  fonction  non sûre vis-à-vis des signaux
          asynchrones et ne renvoie pas depuis l'appel initial à main().

       •  Chaque signal dont le gestionnaire effectue un saut non  local  doit
          être  bloqué  lors de chaque appel à une fonction non sûre vis-à-vis
          des signaux asynchrones et aucune fonction non  sûre  vis-à-vis  des
          signaux  asynchrones  n'est  appelée  après un renvoi depuis l'appel
          initial à main().

VOIR AUSSI
       signal(7), signal-safety(7)

TRADUCTION
       La traduction française de cette page de manuel a été créée par  Chris-
       tophe  Blaess  <https://www.blaess.fr/christophe/>, Stéphan Rafin <ste-
       phan.rafin@laposte.net>, Thierry Vignaud <tvignaud@mandriva.com>, Fran-
       çois  Micaux, Alain Portal <aportal@univ-montp2.fr>, Jean-Philippe Gué-
       rard <fevrier@tigreraye.org>, Jean-Luc  Coulon  (f5ibh)  <jean-luc.cou-
       lon@wanadoo.fr>,  Julien  Cristau <jcristau@debian.org>, Thomas Huriaux
       <thomas.huriaux@gmail.com>, Nicolas François  <nicolas.francois@centra-
       liens.net>,  Florentin  Duneau <fduneau@gmail.com>, Simon Paillard <si-
       mon.paillard@resel.enst-bretagne.fr>,   Denis   Barbier    <barbier@de-
       bian.org>,  David  Prévot  <david@tilapin.org>  et Grégoire Scano <gre-
       goire.scano@malloc.fr>

       Cette traduction est une documentation libre ; veuillez vous reporter à
       la        GNU        General       Public       License       version 3
       ⟨https://www.gnu.org/licenses/gpl-3.0.html⟩ concernant  les  conditions
       de copie et de distribution. Il n'y a aucune RESPONSABILITÉ LÉGALE.

       Si  vous découvrez un bogue dans la traduction de cette page de manuel,
       veuillez envoyer un message à ⟨debian-l10n-french@lists.debian.org⟩.

Pages du manuel de Linux 6.03   5 février 2023                       setjmp(3)

Generated by dwww version 1.15 on Sat Jun 29 01:33:57 CEST 2024.