NOM
getcontext, setcontext - Lire ou écrire le contexte utilisateur
SYNOPSIS
#include <ucontext.h>
int getcontext(ucontext_t *ucp);
int setcontext(const ucontext_t *ucp);
Dans un environnement de type System V, il existe deux types mcontext_t
et ucontext_t définis dans <ucontext.h> et les quatre fonctions
getcontext(), setcontext(), makecontext(3) et swapcontext(3), qui
permettent le changement de contexte au niveau utilisateur entre
plusieurs fils de contrôle au sein du même processus (threads).
Le type mcontext_t est opaque et dépend de la machine. Le type
ucontext_t est une structure ayant au moins les champs suivants :
typedef struct ucontext {
struct ucontext *uc_link;
sigset_t uc_sigmask;
stack_t uc_stack;
mcontext_t uc_mcontext;
...
} ucontext_t;
Les types sigset_t et stack_t sont définis dans <signal.h>. Ici,
uc_link pointe sur le contexte qui doit être restauré lorsque le
contexte courant se terminera (si le contexte en cours a été créé par
makecontext(3)), uc_sigmask est l’ensemble des signaux bloqués dans ce
contexte (voir sigprocmask(2)), uc_stack est la pile utilisée par ce
contexte (voir sigaltstack(2)), et uc_mcontext est la représentation —
dépendant de la machine — du contexte sauvegardé, qui inclue les
registres du processeur pour le thread appelant.
La fonction getcontext() remplit la structure pointée par ucp avec le
contexte actuellement actif.
La fonction setcontext() restaure le contexte utilisateur pointé par
ucp. Un appel réussi ne revient pas. Le contexte doit avoir été obtenu
par un appel getcontext(), ou makecontext(3), ou passé en troisième
argument à un gestionnaire de signal.
Si le contexte a été obtenu par un appel getcontext(), l’exécution du
programme reprend comme si cet appel venait juste de se terminer.
Si le contexte a été obtenu par un appel makecontext(3), l’exécution du
programme continue par l’appel de la fonction func indiquée en second
argument de makecontext(3). Quand la fonction func se termine, on
continue avec le membre uc_link de la structure ucp spécifiée en
premier argument de l’appel makecontext(3). Si ce membre est NULL, le
thread se termine.
Si le contexte a été obtenu lors d’un appel à un gestionnaire de
signal, alors le texte des anciens standards dit que « l’exécution du
programme continue avec l’instruction suivant celle qui a été
interrompue par le signal ». Toutefois cette phrase a été supprimée de
SUSv2, et remplacée par "« le résultat n’est pas spécifié ».
VALEUR RENVOYÉE
Lorsqu’ils réussissent, getcontext() renvoie zéro et setcontext() ne
revient pas. En cas d’erreur, ils retournent -1 et remplissent errno
avec le code d’erreur adéquat.
ERREURS
Aucune définie.
CONFORMITÉ
SUSv2, POSIX.1-2001. POSIX.1-2008 supprime la spécification de
getcontext(), en citant des problèmes de portabilité et en recommandant
à la place que les applications soient récrites en utilisant les
threads POSIX.
NOTES
L’incarnation la plus ancienne de ce mécanisme était constituée de la
paire setjmp(3)/longjmp(3). Comme ils ne précisent pas la gestion des
signaux, l’étape suivante fut sigsetjmp(3)/siglongjmp(3). Le mécanisme
actuel donne plus de contrôle. En revanche, il n’y a pas de moyen
simple pour savoir si le retour de getcontext() se fait depuis son
premier appel ou par l’intermédiaire d’un appel setcontext().
L’utilisateur doit inventer son propre système de comptabilisation, et
pas dans un registre car il serait restauré.
Lorsqu’un signal arrive, le contexte utilisateur courant est sauvegardé
et un nouveau contexte est créé par le noyau pour exécuter le
gestionnaire. N’utilisez pas longjmp(3) dans le gestionnaire, le
comportement est indéfini. Utilisez siglongjmp(3) ou setcontext().
VOIR AUSSI
sigaction(2), sigaltstack(2), sigprocmask(2), longjmp(3),
makecontext(3), sigsetjmp(3)
COLOPHON
Cette page fait partie de la publication 3.23 du projet man-pages
Linux. Une description du projet et des instructions pour signaler des
anomalies peuvent être trouvées à l’adresse
http://www.kernel.org/doc/man-pages/.
TRADUCTION
Cette page de manuel a été traduite et mise à jour par Christophe
Blaess <http://www.blaess.fr/christophe/> entre 1996 et 2003, puis par
Alain Portal <aportal AT univ-montp2 DOT fr> jusqu’en 2006, et mise à
disposition sur http://manpagesfr.free.fr/.
Les mises à jour et corrections de la version présente dans Debian sont
directement gérées par Julien Cristau <jcristau@debian.org> et l’équipe
francophone de traduction de Debian.
Veuillez signaler toute erreur de traduction en écrivant à
<debian-l10n-french@lists.debian.org> ou par un rapport de bogue sur le
paquet manpages-fr.
Vous pouvez toujours avoir accès à la version anglaise de ce document
en utilisant la commande « man -L C <section> <page_de_man> ».