getcontext, setcontext - Lire ou écrire le contexte utilisateur.
Dans un environnement de type SysV, il existe deux types
mcontext_t et
ucontext_t
définis dans
<ucontext.h>
et les quatre fonctions
getcontext(),
setcontext(),
makecontext() et
swapcontext()
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()),
uc_sigmask
est l'ensemble des signaux bloqués dans 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(),
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(),
l'exécution du programme continue par l'appel de la fonction
func
indiquée en second argument de
makecontext().
Quand la fonction
func
se terminer, on continue avec le membre
uc_link
de la structure
ucp
spécifiée en premier argument de l'appel
makecontext().
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é".
Aucune définie.
Christophe Blaess, 1996-2003.