Provided by: manpages-fr-dev_3.27fr1.4-1_all bug

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