.\" -*- coding: UTF-8 -*- .\" Copyright (C) 2016 Michael Kerrisk .\" .\" %%%LICENSE_START(GPLv2+_DOC_FULL) .\" This is free documentation; you can redistribute it and/or .\" modify it under the terms of the GNU General Public License as .\" published by the Free Software Foundation; either version 2 of .\" the License, or (at your option) any later version. .\" .\" The GNU General Public License's references to "object code" .\" and "executables" are to be interpreted as the output of any .\" document formatting or typesetting system, including .\" intermediate and printed output. .\" .\" This manual is distributed in the hope that it will be useful, .\" but WITHOUT ANY WARRANTY; without even the implied warranty of .\" MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the .\" GNU General Public License for more details. .\" .\" You should have received a copy of the GNU General Public .\" License along with this manual; if not, see .\" . .\" %%%LICENSE_END .\" .\"******************************************************************* .\" .\" This file was generated with po4a. Translate the source file. .\" .\"******************************************************************* .TH SETJMP 3 "13 mars 2017" "" "Manuel du programmeur Linux" .SH NOM setjmp, sigsetjmp, longjmp, siglongjmp \- Effectuer un saut non local .SH SYNOPSIS .nf \fB#include \fP .PP \fBint setjmp(jmp_buf \fP\fIenv\fP\fB);\fP \fBint sigsetjmp(sigjmp_buf \fP\fIenv\fP\fB, int \fP\fIsauvsigs\fP\fB);\fP .PP \fBvoid longjmp(jmp_buf \fP\fIenv\fP\fB, int \fP\fIval\fP\fB);\fP \fBvoid siglongjmp(sigjmp_buf \fP\fIenv\fP\fB, int \fP\fIval\fP\fB);\fP .fi .PP .RS -4 Exigences de macros de test de fonctionnalités pour la glibc (consulter \fBfeature_test_macros\fP(7))\ : .RE .PP \fBsetjmp\fP()\ : consultez la section NOTES. .PP \fBsigsetjmp\fP()\ : _POSIX_C_SOURCE .SH 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 \fBsetjmp\fP() établit de façon dynamique l'emplacement vers lequel le contrôle sera transféré ultérieurement et \fBlongjmp\fP() se charge de transférer l'exécution. .PP La fonction \fBsetjmp\fP() 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 \fIenv\fP pour son utilisation ultérieure par \fBlongjmp\fP(). Dans ce cas, \fBsetjmp\fP() renvoie \fB0\fP. .PP La fonction \fBlongjmp\fP() utilise les informations stockées dans \fIenv\fP pour transférer le contrôle à l'endroit où \fBsetjmp\fP() fut appelé et restaurer («\ rewind\ ») la pile à son état lors de l'appel à \fBsetjmp\fP(). De plus, et en fonction de l'implémentation (voir NOTES), les valeurs d'autres registres et le masque de signaux du processus peuvent également être restaurées à leur état lors de l'appel à \fBsetjmp\fP(). .PP Après un appel réussi à \fBlongjmp\fP(), l'exécution continue comme si \fBsetjmp\fP() avait renvoyé une deuxième fois. Ce renvoi «\ factice\ » peut être distingué d'un vrai appel à \fBsetjmp\fP() car il renvoie la valeur contenue dans \fIval\fP. Si le programmeur passe la valeur \fB0\fP à \fIval\fP par inadvertance, le renvoi «\ factice\ » retourne \fB1\fP à la place. .SS "sigsetjmp() et siglongjmp()" \fBsigsetjmp\fP() et \fBsiglongjmp\fP() effectuent également des sauts non locaux mais permettent une gestion prévisible du masque de signaux du processus. .PP Si, et seulement si, l'argument \fIsauvsigs\fP passé à \fBsigsetjmp\fP() est non nul, le masque de signaux actuel du processus est sauvegardé dans \fIenv\fP et sera rétabli lorsque \fBsiglongjmp\fP() sera invoquée avec ce contexte \fIenv\fP. .SH "VALEUR RENVOYÉE" \fBsetjmp\fP() et \fBsigsetjmp\fP() renvoient \fB0\fP lorsqu'elles sont appelées directement\ ; la valeur non nulle spécifiée dans \fIval\fP est renvoyée lors du renvoi «\ factice\ » qui se produit après un appel à \fBlongjmp\fP() ou \fBsiglongjmp\fP(). .PP Les fonctions \fBlongjmp\fP() et \fBsiglongjmp\fP() ne renvoient pas. .SH ATTRIBUTS Pour une explication des termes utilisés dans cette section, consulter \fBattributes\fP(7). .TS allbox; lbw23 lb lb l l l. Interface Attribut Valeur T{ \fBsetjmp\fP(), \fBsigsetjmp\fP() T} Sécurité des threads MT\-Safe T{ \fBlongjmp\fP(), \fBsiglongjmp\fP() T} Sécurité des threads MT\-Safe .TE .SH CONFORMITÉ \fBsetjmp\fP(), \fBlongjmp\fP()\ : POSIX.1\-2001, POSIX.1\-2008, C89, C99. .PP \fBsigsetjmp\fP(), \fBsiglongjmp\fP()\ : POSIX.1\-2001, POSIX.1\-2008. .SH NOTES .\" so that _FAVOR_BSD is triggered .\" .BR _XOPEN_SOURCE_EXTENDED , POSIX ne spécifie pas si \fBsetjmp\fP() sauve le masque de signaux (pour être ensuite restauré lors de \fBlongjmp\fP()). Sous System\ V, ce n'est pas le cas. Sous 4.3BSD, le masque sera sauvé et il y a une fonction \fB_setjmp\fP 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. Sous Linux avec glibc avant la version\ 2.19, \fBsetjmp\fP() suit le comportement de System\ V par défaut, mais le comportement BSD est fourni si la macro de test de fonctionnalités \fB_BSD_SOURCE\fP est définie et qu’aucune des macros \fB_POSIX_SOURCE\fP, \fB_POSIX_C_SOURCE\fP, \fB_XOPEN_SOURCE\fP, \fB_GNU_SOURCE\fP ou \fB_SVID_SOURCE\fP n'est définie. Depuis glibc\ 2.19, \fI\fP n’expose que la version System\ V de \fBsetjmp\fP(). Les programmes ayant besoin de le sémantique BSD devraient remplacer les appels de \fBsetjmp\fP() par des appels de \fBsigsetjmp\fP() avec un argument \fIsauvsigs\fP non nul. .PP \fBsetjmp\fP() et \fBlongjmp\fP() 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 \fBsigsetjmp\fP() et \fBsiglongjmp\fP(). Consultez également la sous\-section sur la lisibilité des programmes ci\-dessous. .PP Le compilateur peut optimiser certaines variables dans des registres et \fBlongjmp\fP() 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 à \fBlongjmp\fP() si elles satisfont à tous les critères suivants\ : .IP \(bu 3 elles sont locales à la fonction qui a effectué l'appel correspondant à \fBsetjmp\fP()\ ; .IP \(bu leur valeur est changée entre les appels à \fBsetjmp\fP() et \fBlongjmp\fP()\ ; .IP \(bu elles ne sont pas déclarées comme \fIvolatile\fP. .PP .\" Ces remarques s'appliquent aussi à \fBsiglongjmp\fP(). .SS "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 à \fBsetjmp\fP() peuvent utiliser la même variable \fIjmp_buf\fP 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 \fBlongjmp\fP() particulier (pour rendre la tâche du programmeur plus simple, chaque appel à \fBsetjmp\fP() devrait utiliser une variable \fIjmp_buf\fP unique). .PP De façon encore plus compliquée, les appels à \fBsetjmp\fP() et \fBlongjmp\fP() peuvent même provenir de modules de code source différents. .PP .\" 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. .SS "Mises en garde" Si la fonction qui a appelé \fBsetjmp\fP() renvoie avant que \fBlongjmp\fP() 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. .PP .\" .\" The following statement appeared in versions up to POSIX.1-2008 TC1, .\" but is set to be removed in POSIX.1-2008 TC2: .\" .\" According to POSIX.1, if a .\" .BR longjmp () .\" call is performed from a nested signal handler .\" (i.e., from a handler that was invoked in response to a signal that was .\" generated while another signal was already in the process of being .\" handled), the behavior is undefined. Si, dans un programme à plusieurs fils d'exécution, un appel à \fBlongjmp\fP() utilise un tampon \fIenv\fP initialisé préalablement par \fBsetjmp\fP() dans un fil d'exécution différent, le comportement n'est pas défini. .PP .\" http://austingroupbugs.net/view.php?id=516#c1195 Le Technical Corrigendum\ 2 de POSIX.1\-2008 ajoute \fBlongjmp\fP() et \fBsiglongjmp\fP() à 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 à \fBexit\fP(3) se produisant après un renvoi de l'appel initial \fImain\fP()), 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\ : .IP * 3 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 à \fImain\fP(). .IP * Chaque signal dont le gestionnaire effectue un saut non local doit être bloqué lors de \fIchaque\fP 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 à \fImain\fP(). .SH "VOIR AUSSI" \fBsignal\fP(7), \fBsignal\-safety\fP(7) .SH COLOPHON Cette page fait partie de la publication\ 5.10 du projet \fIman\-pages\fP Linux. Une description du projet et des instructions pour signaler des anomalies et la dernière version de cette page peuvent être trouvées à l'adresse \%https://www.kernel.org/doc/man\-pages/. .PP .SH TRADUCTION La traduction française de cette page de manuel a été créée par Christophe Blaess , Stéphan Rafin , Thierry Vignaud , François Micaux, Alain Portal , Jean-Philippe Guérard , Jean-Luc Coulon (f5ibh) , Julien Cristau , Thomas Huriaux , Nicolas François , Florentin Duneau , Simon Paillard , Denis Barbier , David Prévot et Grégoire Scano . .PP Cette traduction est une documentation libre ; veuillez vous reporter à la .UR https://www.gnu.org/licenses/gpl-3.0.html GNU General Public License version 3 .UE concernant les conditions de copie et de distribution. Il n'y a aucune RESPONSABILITÉ LÉGALE. .PP Si vous découvrez un bogue dans la traduction de cette page de manuel, veuillez envoyer un message à .MT debian-l10n-french@lists.debian.org .ME .