Man page - longjmp(3)

Packages contains this manual

Available languages:

en fr pl ja ru de

Manual

setjmp

NOM
BIBLIOTHÈQUE
SYNOPSIS
DESCRIPTION
sigsetjmp() et siglongjmp()
VALEUR RENVOYÉE
ATTRIBUTS
STANDARDS
HISTORIQUE
NOTES
AVERTISSEMENTS
Sauts non locaux et lisibilité des programmes
Comportement indéfini
VOIR AUSSI
TRADUCTION

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 HISTORIQUE.

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Ă©cution.

La fonction setjmp () sauvegarde diverses informations concernant l’environnement 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 et HISTORIQUE), les valeurs d’autres registres 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 setjmp () 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 processus.

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 directement ; la valeur non nulle spĂ©cifiĂ©e dans val est renvoyĂ©e lors du renvoi « factice » qui se produit aprĂšs un appel Ă  longjmp () ou siglongjmp ().

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

ATTRIBUTS

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

Image grohtml-3880938-1.png

STANDARDS

setjmp ()
longjmp
()

C11, POSIX.1-2008.

sigsetjmp ()
siglongjmp
()

POSIX.1-2008.

HISTORIQUE

setjmp ()
longjmp
()

POSIX.1-2001, C89.

sigsetjmp ()
siglongjmp
()

POSIX.1-2001.

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 version 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 appels de sigsetjmp () avec un argument sauvsigs non nul.

NOTES

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 principal. Dans ce dernier cas, si vous dĂ©sirez sauvegarder et restaurer les masques de signaux de maniĂšre portable, utilisez sigsetjmp () et siglongjmp (). Consultez Ă©galement la sous-section sur la lisibilitĂ© des programmes ci-dessous.

AVERTISSEMENTS

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 variables 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 correspondant Ă  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 exploitĂ©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 percevoir de façon claire le flux de contrĂŽle. Les sauts non locaux ne fournissent pas de tels repĂšres : plusieurs appels Ă  setjmp () peuvent utiliser 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 utiliser 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 difficiles Ă  comprendre et Ă  maintenir, et une alternative devrait ĂȘtre utilisĂ©e lorsque c’est possible.

Comportement indéfini

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 Ă  longjmp () 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 siglongjmp () Ă  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 appelĂ©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 programme 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 programme 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 Christophe Blaess <https://www.blaess.fr/christophe/>, Stéphan Rafin <stephan.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.coulon@wanadoo.fr>, Julien Cristau <jcristau@debian.org>, Thomas Huriaux <thomas.huriaux@gmail.com>, Nicolas François <nicolas.francois@centraliens.net>, Florentin Duneau <fduneau@gmail.com>, Simon Paillard <simon.paillard@resel.enst-bretagne.fr>, Denis Barbier <barbier@debian.org>, David Prévot <david@tilapin.org> et Grégoire Scano <gregoire.scano@malloc.fr>

Cette traduction est une documentation libre ; veuillez vous reporter à la GNU General Public License version 3 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 .