makecontext(3) Library Functions Manual makecontext(3) NOM makecontext, swapcontext - Manipulation du contexte utilisateur BIBLIOTHEQUE Bibliotheque C standard (libc, -lc) SYNOPSIS #include void makecontext(ucontext_t *ucp, void (*func)(), int argc, ...); int swapcontext(ucontext_t *restrict oucp, const ucontext_t *restrict ucp); DESCRIPTION Dans un environnement de type System V, on dispose du type ucontext_t (defini dans et decrit dansgetcontext(3)) et des quatre fonctions getcontext(3), setcontext(2), makecontext() et swapcontext() qui permettent, au niveau utilisateur, des permutations de contextes entre plusieurs threads de controle au sein d'un processus. La fonction makecontext() modifie le contexte pointe par ucp (qui a ete obtenu par un appel a getcontext(3)). 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(3) 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 RENVOYEE 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 definit errno pour indiquer l'erreur. ERREURS ENOMEM Espace de pile disponible insuffisant. ATTRIBUTS Pour une explication des termes utilises dans cette section, consulter attributes(7). +--------------+--------------------------+----------------------------+ |Interface | Attribut | Valeur | +--------------+--------------------------+----------------------------+ |makecontext() | Securite des threads | MT-Safe race:ucp | +--------------+--------------------------+----------------------------+ |swapcontext() | Securite des threads | MT-Safe race:oucp race:ucp | +--------------+--------------------------+----------------------------+ STANDARDS Aucun. HISTORIQUE glibc 2.1. SUSv2, POSIX.1-2001. Supprimee dans POSIX.1-2008 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 (par exemple, pour x86-32, leur taille est de 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 glibc 2.8, la glibc a effectue quelques changements a makecontext(), afin de permettre cela sur certaines architectures 64 bits (par exemple, x86-64). EXEMPLES Le programme d'exemple ci-dessous decrit l'utilisation de getcontext(3), 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 #include #include 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("%s: started\n", __func__); printf("%s: swapcontext(&uctx_func1, &uctx_func2)\n", __func__); if (swapcontext(&uctx_func1, &uctx_func2) == -1) handle_error("swapcontext"); printf("%s: returning\n", __func__); } static void func2(void) { printf("%s: started\n", __func__); printf("%s: swapcontext(&uctx_func2, &uctx_func1)\n", __func__); if (swapcontext(&uctx_func2, &uctx_func1) == -1) handle_error("swapcontext"); printf("%s: returning\n", __func__); } 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("%s: swapcontext(&uctx_main, &uctx_func2)\n", __func__); if (swapcontext(&uctx_main, &uctx_func2) == -1) handle_error("swapcontext"); printf("%s: exiting\n", __func__); exit(EXIT_SUCCESS); } VOIR AUSSI sigaction(2), sigaltstack(2), sigprocmask(2), getcontext(3), sigsetjmp(3) TRADUCTION La traduction francaise de cette page de manuel a ete creee par Christophe Blaess , Stephan Rafin , Thierry Vignaud , Francois Micaux, Alain Portal , Jean-Philippe Guerard , Jean-Luc Coulon (f5ibh) , Julien Cristau , Thomas Huriaux , Nicolas Francois , Florentin Duneau , Simon Paillard , Denis Barbier , David Prevot et Frederic Hantrais Cette traduction est une documentation libre ; veuillez vous reporter a la GNU General Public License version 3 concernant les conditions de copie et de distribution. Il n'y a aucune RESPONSABILITE LEGALE. Si vous decouvrez un bogue dans la traduction de cette page de manuel, veuillez envoyer un message a . Pages du manuel de Linux 6.06 31 octobre 2023 makecontext(3)