Date création : 27-03-2008 20:23:44
 Vous êtes dans : GNU/Linux Astuces / Pages man [Section3 - Sous-fonctions]
MAKECONTEXT
Index
- NOM
- SYNOPSIS
- DESCRIPTION
- VALEUR RENVOYÉE
- ERREURS
- NOTES
- CONFORMITÉ À
- EXEMPLE
- VOIR AUSSI
- TRADUCTION
NOM
makecontext, swapcontext - Manipulation du contexte utilisateur.
SYNOPSIS
#include <ucontext.h>
void makecontext(ucontext_t *ucp, void *func(), int
argc, ...);
int swapcontext(ucontext_t *oucp, ucontext_t *ucp);
DESCRIPTION
Dans un environnement de type Système V, on dispose du type ucontext_t
défini dans <ucontext.h> et des quatre fonctions getcontext(),
setcontext(), makecontext() et swapcontext() qui permettent, au
niveau utilisateur, des permutations de contextes entre plusieurs threads de
contrôle au sein d'un processus.
Pour le type et les deux premières fonctions, voir getcontext(2).
La fonction makecontext() modifie le contexte pointé par ucp (qui a
été obtenu par un appel à getcontext()). Avant d'appeler
makecontext(), l'appelant doit allouer une nouvelle pile pour ce contexte
et l'affecter à ucp->uc_stack, et définir un contexte successeur et
l'affecter à ucp->uc_link.
Lorsque ce contexte est activé par la suite (avec setcontext() ou
swapcontext()), alors la fonction func() est tout d'abord appelée avec
la série d'arguments de type int spécifiés à la suite de argc ;
l'appelant doit préciser le nombre de ces arguments dans argc. Lorsque
cette fonction s'achève, le contexte successeur est activé. Lorsque le
pointeur sur le contexte successeur vaut NULL, le thread se termine.
La fonction swapcontext() sauvegarde le contexte actuel dans la structure
pointée par oucp et active ensuite le contexte pointé par ucp.
VALEUR RENVOYÉE
En cas de succès, swapcontext() ne rend pas la main à l'appelant (on peut
toutefois revenir à l'appelant en cas d'activation de oucp. Dans un tel
cas, swapcontext se comporte comme si elle renvoyait 0.) En cas d'erreur,
elle renvoie -1 et positionne errno de façon appropriée.
ERREURS
- ENOMEM
-
Espace de pile disponible insuffisant.
NOTES
L'interprétation de ucp->uc_stack est exactement la même que pour
sigaltstack(2), à savoir, cette structure contient l'adresse de départ et
la longueur d'une zone mémoire destinée à être utilisée comme pile, et ce,
sans considération sur le sens d'expansion de la pile. Il n'est donc pas
nécessaire pour le programme utilisateur de se soucier de ce sens.
CONFORMITÉ À
SUSv2, POSIX.1-2001.
EXEMPLE
Le programme d'exemple ci-dessous explique l'utilisation de getcontext(),
makecontext(), et swapcontext(). Ce programme produit la sortie
suivante :
$ ./a.out
main: swapcontext(&uctx_main, &uctx_func2)
func2: started
func2: swapcontext(&uctx_func2, &uctx_func1)
func1: started
func1: swapcontext(&uctx_func1, &uctx_func2)
func2: returning
func1: returning
main: exiting
#include <ucontext.h>
#include <stdio.h>
#include <stdlib.h>
static ucontext_t uctx_main, uctx_func1, uctx_func2;
#define die(msg) do { perror(msg); exit(EXIT_FAILURE); } while (0)
static void
func1(void)
{
printf("func1: started
");
printf("func1: swapcontext(&uctx_func1, &uctx_func2)
");
if (swapcontext(&uctx_func1, &uctx_func2) == -1)
die("swapcontext");
printf("func1: returning
");
}
static void
func2(void)
{
printf("func2: started
");
printf("func2: swapcontext(&uctx_func2, &uctx_func1)
");
if (swapcontext(&uctx_func2, &uctx_func1) == -1)
die("swapcontext");
printf("func2: returning
");
}
int
main(int argc, char *argv[])
{
char func1_stack[16384];
char func2_stack[16384];
if (getcontext(&uctx_func1) == -1)
die("getcontext");
uctx_func1.uc_stack.ss_sp = func1_stack;
uctx_func1.uc_stack.ss_size = sizeof(func1_stack);
uctx_func1.uc_link = &uctx_main;
makecontext(&uctx_func1, func1, 0);
if (getcontext(&uctx_func2) == -1)
die("getcontext");
uctx_func2.uc_stack.ss_sp = func2_stack;
uctx_func2.uc_stack.ss_size = sizeof(func2_stack);
/* Successor context is f1(), unless argc > 1 */
uctx_func2.uc_link = (argc > 1) ? NULL : &uctx_func1;
makecontext(&uctx_func2, func2, 0);
printf("main: swapcontext(&uctx_main, &uctx_func2)
");
if (swapcontext(&uctx_main, &uctx_func2) == -1)
die("swapcontext");
printf("main: exiting
");
exit(EXIT_SUCCESS);
}
VOIR AUSSI
getcontext(2), sigaction(2), sigaltstack(2), sigprocmask(2),
sigsetjmp(3)
TRADUCTION
Cette page de manuel a été traduite par
Stéphan Rafin <stephan DOT rafin AT laposte DOT net> en 2002,
puis a été mise à jour par
Alain Portal <aportal AT univ-montp2 DOT fr> jusqu'en 2006.
La traduction de cette page de manuel est basée sur les traductions
disponibles sur http://manpagesfr.free.fr/,
mais est gérée par l'équipe francophone de traduction de Debian
au travers de la liste de discussion debian-l10n-french.
Veuillez signaler toute erreur de traduction 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> ».
|