Provided by:
manpages-fr-dev_3.27fr1.4-1_all 
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 System V, on dispose du type ucontext_t
defini dans <ucontext.h> et des quatre fonctions getcontext(2),
setcontext(2), makecontext() et swapcontext() qui permettent, au niveau
utilisateur, des permutations de contextes entre plusieurs threads de
controle au sein d'un processus.
Pour le type et les deux premieres fonctions, consultez getcontext(2).
La fonction makecontext() modifie le contexte pointe par ucp (qui a ete
obtenu par un appel a getcontext(2)). Avant d'appeler makecontext(),
l'appelant doit allouer une nouvelle pile pour ce contexte et
l'affecter a ucp->uc_stack et definir un contexte successeur et
l'affecter a ucp->uc_link.
Lorsque ce contexte est active par la suite (avec setcontext(2) ou
swapcontext()), alors la fonction func() est tout d'abord appelee avec
la serie d'arguments de type int specifies a la suite de argc ;
l'appelant doit preciser le nombre de ces arguments dans argc. Lorsque
cette fonction s'acheve, le contexte successeur est active. Lorsque le
pointeur sur le contexte successeur vaut NULL, le thread se termine.
La fonction swapcontext() sauvegarde le contexte actuel dans la
structure pointee par oucp et active ensuite le contexte pointe par
ucp.
VALEUR RENVOY'EE
En cas de succes, swapcontext() ne rend pas la main a l'appelant (on
peut toutefois revenir a l'appelant en cas d'activation de oucp ; dans
un tel cas, swapcontext se comporte comme si elle renvoyait 0). En cas
d'erreur, swapcontext() renvoie -1 et positionne errno de facon
appropriee.
ERREURS
ENOMEM Espace de pile disponible insuffisant.
VERSIONS
makecontext() et swapcontext() sont fournies par la glibc depuis la
version 2.1.
CONFORMIT'E
SUSv2, POSIX.1-2001. POSIX.1-2008 supprime les specifications de
makecontext() et swapcontext() a cause de problemes de portabilite, et
recommande que les applications soient reecrites avec des processus
legers POSIX a la place.
NOTES
L'interpretation de ucp->uc_stack est exactement la meme que pour
sigaltstack(2), a savoir, cette structure contient l'adresse de depart
et la longueur d'une zone memoire destinee a etre utilisee comme pile,
et ce, sans consideration sur le sens d'expansion de la pile. Il n'est
donc pas necessaire pour le programme utilisateur de se soucier de ce
sens.
Sur les architectures ou le type int et les types << pointeur >> sont
de meme taille (p. ex., pour x86-32, leur taille est 32 bits), vous
pouvez passer outre en passant des pointeurs comme parametres a
makecontext() suivi de argc. Cependant, sachez que cela n'est pas
forcement portable, et indefini selon les standards, et ne fonctionnera
pas sur les architectures ou la taille des pointeurs est superieure a
la taille des entiers int. Neanmoins, avec la version 2.8, la glibc
effectue quelques changements a makecontext(), afin de permettre cela
sur certaines architecture 64 bits (p. ex., x86-64).
EXEMPLE
Le programme d'exemple ci-dessous decrit l'utilisation de
getcontext(2), 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
Source du programme
#include <ucontext.h>
#include <stdio.h>
#include <stdlib.h>
static ucontext_t uctx_main, uctx_func1, uctx_func2;
#define handle_error(msg) \
do { perror(msg); exit(EXIT_FAILURE); } while (0)
static void
func1(void)
{
printf("func1: started\n");
printf("func1: swapcontext(&uctx_func1, &uctx_func2)\n");
if (swapcontext(&uctx_func1, &uctx_func2) == -1)
handle_error("swapcontext");
printf("func1: returning\n");
}
static void
func2(void)
{
printf("func2: started\n");
printf("func2: swapcontext(&uctx_func2, &uctx_func1)\n");
if (swapcontext(&uctx_func2, &uctx_func1) == -1)
handle_error("swapcontext");
printf("func2: returning\n");
}
int
main(int argc, char *argv[])
{
char func1_stack[16384];
char func2_stack[16384];
if (getcontext(&uctx_func1) == -1)
handle_error("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)
handle_error("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)\n");
if (swapcontext(&uctx_main, &uctx_func2) == -1)
handle_error("swapcontext");
printf("main: exiting\n");
exit(EXIT_SUCCESS);
}
VOIR AUSSI
getcontext(2), sigaction(2), sigaltstack(2), sigprocmask(2),
sigsetjmp(3)
COLOPHON
Cette page fait partie de la publication 3.27 du projet man-pages
Linux. Une description du projet et des instructions pour signaler des
anomalies peuvent etre trouvees a l'adresse
<URL:http://www.kernel.org/doc/man-pages/>.
TRADUCTION
Depuis 2010, cette traduction est maintenue a l'aide de l'outil po4a
<URL:http://po4a.alioth.debian.org/> par l'equipe de traduction
francophone au sein du projet perkamon
<URL:http://perkamon.alioth.debian.org/>.
Stephan Rafin (2002), Alain Portal
<URL:http://manpagesfr.free.fr/> (2006). Florentin Duneau et l'equipe
francophone de traduction de Debian (2006-2009).
Veuillez signaler toute erreur de traduction en ecrivant a
<debian-l10n-french@lists.debian.org> ou par un rapport de bogue sur le
paquet manpages-fr.
Vous pouvez toujours avoir acces a la version anglaise de ce document
en utilisant la commande << man -L C <section> <page_de_man> >>.