Manpages

NOM

getcontext, setcontext - Lire ou écrire le contexte utilisateur

SYNOPSIS

#include <ucontext.h>

int getcontext(ucontext_t *ucp);
int setcontext(const ucontext_t *
ucp);

DESCRIPTION

In a System V-like environment, one has the two types mcontext_t and ucontext_t defined in <ucontext.h> and the four functions getcontext(), setcontext(), makecontext(3), and swapcontext(3) that allow user-level context switching between multiple threads of control within a process.

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() 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.

ATTRIBUTS

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

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

The earliest incarnation of this mechanism was the setjmp(3)/longjmp(3) mechanism. Since that does not define the handling of the signal context, the next stage was the sigsetjmp(3)/siglongjmp(3) pair. The present mechanism gives much more control. On the other hand, there is no easy way to detect whether a return from getcontext() is from the first call, or via a setcontext() call. The user has to invent their own bookkeeping device, and a register variable won’t do since registers are restored.

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 5.07 du projet man-pages 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/.

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 [AT] laposte.net>, Thierry Vignaud <tvignaud [AT] mandriva.com>, François Micaux, Alain Portal <aportal [AT] univ-montp2.fr>, Jean-Philippe Guérard <fevrier [AT] tigreraye.org>, Jean-Luc Coulon (f5ibh) <jean-luc.coulon [AT] wanadoo.fr>, Julien Cristau <jcristau [AT] debian.org>, Thomas Huriaux <thomas.huriaux [AT] gmail.com>, Nicolas François <nicolas.francois [AT] centraliens.net>, Florentin Duneau <fduneau [AT] gmail.com>, Simon Paillard <simon.paillard [AT] resel.fr>, Denis Barbier <barbier [AT] debian.org>, David Prévot <david [AT] tilapin.org> et Frédéric Hantrais <fhantrais [AT] gmail.com>

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 [AT] lists.org>.