getcontext, setcontext - Lire ou écrire le contexte utilisateur
Bibliothèque C standard (
libc,
-lc)
#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_t {
struct ucontext_t *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 (consultez
sigprocmask(2)),
uc_stack est la pile utilisée par ce contexte (consultez
sigaltstack(2)), et
uc_mcontext est la représentation
— dépendant de la machine — du contexte
sauvegardé, qui inclut les registres du processeur pour le thread
appelant.
La fonction
getcontext() initialise 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é ».
Lorsqu'ils réussissent,
getcontext() renvoie
0 et
setcontext() ne revient pas. En cas d'erreur, ils retournent
-1
et définissent
errno pour indiquer l'erreur.
Aucune définie.
Pour une explication des termes utilisés dans cette section, consulter
attributes(7).
Interface |
Attribut |
Valeur |
getcontext(), setcontext() |
Sécurité des threads |
MT-Safe race:ucp |
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.
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 du contexte du signal, 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().
sigaction(2),
sigaltstack(2),
sigprocmask(2),
longjmp(3),
makecontext(3),
sigsetjmp(3),
signal(7)
La traduction française de cette page de manuel a été
créée par Christophe Blaess
<
https://www.blaess.fr/christophe/>, Stéphan Rafin
<
[email protected]>, Thierry Vignaud
<
[email protected]>, François Micaux, Alain Portal
<
[email protected]>, Jean-Philippe Guérard
<
[email protected]>, Jean-Luc Coulon (f5ibh)
<
[email protected]>, Julien Cristau
<
[email protected]>, Thomas Huriaux <
[email protected]>,
Nicolas François <
[email protected]>, Florentin
Duneau <
[email protected]>, Simon Paillard
<
[email protected]>, Denis Barbier
<
[email protected]>, David Prévot <
[email protected]> et
Frédéric Hantrais <
[email protected]>
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 à
[email protected]