Votre IP: 38.107.179.243 
  
 
Google
 
Accueil e-mail Linux
Linux
Perl
Perl
C
Langage C
Dico
Dictionnaire
Biblio liens
Bibliothèque de liens
Index articles
Index articles
 

Date création : 27-03-2008 20:23:44

Linux  Vous êtes dans : GNU/Linux Astuces / Pages man [Section3 - Sous-fonctions]


MAKECONTEXT

 

Index

  1. NOM
  2. SYNOPSIS
  3. DESCRIPTION
  4. VALEUR RENVOYÉE
  5. ERREURS
  6. NOTES
  7. CONFORMITÉ À
  8. EXEMPLE
  9. VOIR AUSSI
  10. TRADUCTION

 

NOMIndex

makecontext, swapcontext - Manipulation du contexte utilisateur.  

SYNOPSISIndex

#include <ucontext.h>
void makecontext(ucontext_t *ucp, void *func(), int argc, ...);
int swapcontext(ucontext_t *oucp, ucontext_t *ucp);  

DESCRIPTIONIndex

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ÉEIndex

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.  

ERREURSIndex

ENOMEM
Espace de pile disponible insuffisant.
 

NOTESIndex

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É ÀIndex

SUSv2, POSIX.1-2001.  

EXEMPLEIndex


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 AUSSIIndex

getcontext(2), sigaction(2), sigaltstack(2), sigprocmask(2), sigsetjmp(3)  

TRADUCTIONIndex

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


Création : octobre 2007  © Tous droits réservés 2007 linux-perl-c
Valid HTML 4.01 TransitionalValid CSS