.\" -*- coding: UTF-8 -*- .\" Copyright (C) 2001 Andries Brouwer (aeb@cwi.nl) .\" and Copyright (C) 2006 Michael Kerrisk .\" .\" %%%LICENSE_START(VERBATIM) .\" Permission is granted to make and distribute verbatim copies of this .\" manual provided the copyright notice and this permission notice are .\" preserved on all copies. .\" .\" Permission is granted to copy and distribute modified versions of this .\" manual under the conditions for verbatim copying, provided that the .\" entire resulting derived work is distributed under the terms of a .\" permission notice identical to this one. .\" .\" Since the Linux kernel and libraries are constantly changing, this .\" manual page may be incorrect or out-of-date. The author(s) assume no .\" responsibility for errors or omissions, or for damages resulting from .\" the use of the information contained herein. The author(s) may not .\" have taken the same level of care in the production of this manual, .\" which is licensed free of charge, as they might when working .\" professionally. .\" .\" Formatted or processed versions of this manual, if unaccompanied by .\" the source, must acknowledge the copyright and authors of this work. .\" %%%LICENSE_END .\" .\" 2006-08-02, mtk, Added example program .\" .\"******************************************************************* .\" .\" This file was generated with po4a. Translate the source file. .\" .\"******************************************************************* .TH MAKECONTEXT 3 "21 décembre 2020" GNU "Manuel du programmeur Linux" .SH NOM makecontext, swapcontext \- Manipulation du contexte utilisateur .SH SYNOPSIS \fB#include \fP .PP \fBvoid makecontext(ucontext_t *\fP\fIucp\fP\fB, void (*\fP\fIfunc\fP\fB)(),\fP \fBint \fP\fIargc\fP\fB, ...);\fP .PP \fBint swapcontext(ucontext_t *\fP\fIoucp\fP\fB, const ucontext_t *\fP\fIucp\fP\fB);\fP .SH DESCRIPTION In a System V\-like environment, one has the type \fIucontext_t\fP (defined in \fI\fP and described in \fBgetcontext\fP(3)) and the four functions \fBgetcontext\fP(3), \fBsetcontext\fP(3), \fBmakecontext\fP(), and \fBswapcontext\fP() that allow user\-level context switching between multiple threads of control within a process. .PP La fonction \fBmakecontext\fP() modifie le contexte pointé par \fIucp\fP (qui a été obtenu par un appel à \fBgetcontext\fP(3)). Avant d'appeler \fBmakecontext\fP(), l'appelant doit allouer une nouvelle pile pour ce contexte et l'affecter à \fIucp\->uc_stack\fP et définir un contexte successeur et l'affecter à \fIucp\->uc_link\fP. .PP Lorsque ce contexte est activé par la suite (avec \fBsetcontext\fP(3) ou \fBswapcontext\fP()), alors la fonction \fIfunc\fP() est tout d'abord appelée avec la série d'arguments de type \fIint\fP spécifiés à la suite de \fIargc\fP\ ; l'appelant doit préciser le nombre de ces arguments dans \fIargc\fP. Lorsque cette fonction s'achève, le contexte successeur est activé. Lorsque le pointeur sur le contexte successeur vaut NULL, le thread se termine. .PP La fonction \fBswapcontext\fP() sauvegarde le contexte actuel dans la structure pointée par \fIoucp\fP et active ensuite le contexte pointé par \fIucp\fP. .SH "VALEUR RENVOYÉE" En cas de succès, \fBswapcontext\fP() ne rend pas la main à l'appelant (on peut toutefois revenir à l'appelant en cas d'activation de \fIoucp\fP\ ; dans un tel cas, \fBswapcontext\fP se comporte comme si elle renvoyait 0). En cas d'erreur, \fBswapcontext\fP() renvoie \-1 et positionne \fIerrno\fP de façon appropriée. .SH ERREURS .TP \fBENOMEM\fP Espace de pile disponible insuffisant. .SH VERSIONS \fBmakecontext\fP() et \fBswapcontext\fP() sont fournies par la glibc depuis la version\ 2.1. .SH ATTRIBUTS Pour une explication des termes utilisés dans cette section, consulter \fBattributes\fP(7). .TS allbox; lb lb lb l l l. Interface Attribut Valeur T{ \fBmakecontext\fP() T} Sécurité des threads MT\-Safe race:ucp T{ \fBswapcontext\fP() T} Sécurité des threads MT\-Safe race:oucp race:ucp .TE .SH CONFORMITÉ SUSv2, POSIX.1\-2001. POSIX.1\-2008 supprime les spécifications de \fBmakecontext\fP() et \fBswapcontext\fP() à cause de problèmes de portabilité, et recommande que les applications soient réécrites avec des processus légers POSIX à la place. .SH NOTES L'interprétation de \fIucp\->uc_stack\fP est exactement la même que pour \fBsigaltstack\fP(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. .PP Sur les architectures où le type \fIint\fP et les types «\ pointeur\ » sont de même taille (par exemple, pour x86\-32, leur taille est de 32 bits), vous pouvez passer outre en passant des pointeurs comme paramètres à \fBmakecontext\fP() suivi de \fIargc\fP. Cependant, sachez que cela n'est pas forcément portable, et indéfini selon les standards, et ne fonctionnera pas sur les architectures où la taille des pointeurs est supérieure à la taille des entiers \fIint\fP. Néanmoins, avec la version 2.8, la glibc a effectué quelques changements à \fBmakecontext\fP(), afin de permettre cela sur certaines architecture 64 bits (par\ exemple, x86\-64). .SH EXEMPLES Le programme d'exemple ci\-dessous décrit l'utilisation de \fBgetcontext\fP(3), \fBmakecontext\fP() et \fBswapcontext\fP(). Ce programme produit la sortie suivante\ : .PP .in +4n .EX $\fB ./a.out\fP 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 .EE .in .SS "Source du programme" \& .EX #include #include #include static ucontext_t uctx_main, uctx_func1, uctx_func2; #define handle_error(msg) \e do { perror(msg); exit(EXIT_FAILURE); } while (0) static void func1(void) { printf("func1: started\en"); printf("func1: swapcontext(&uctx_func1, &uctx_func2)\en"); if (swapcontext(&uctx_func1, &uctx_func2) == \-1) handle_error("swapcontext"); printf("func1: returning\en"); } static void func2(void) { printf("func2: started\en"); printf("func2: swapcontext(&uctx_func2, &uctx_func1)\en"); if (swapcontext(&uctx_func2, &uctx_func1) == \-1) handle_error("swapcontext"); printf("func2: returning\en"); } 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)\en"); if (swapcontext(&uctx_main, &uctx_func2) == \-1) handle_error("swapcontext"); printf("main: exiting\en"); exit(EXIT_SUCCESS); } .EE .SH "VOIR AUSSI" \fBsigaction\fP(2), \fBsigaltstack\fP(2), \fBsigprocmask\fP(2), \fBgetcontext\fP(3), \fBsigsetjmp\fP(3) .SH COLOPHON Cette page fait partie de la publication\ 5.10 du projet \fIman\-pages\fP Linux. Une description du projet et des instructions pour signaler des anomalies et la dernière version de cette page peuvent être trouvées à l'adresse \%https://www.kernel.org/doc/man\-pages/. .SH TRADUCTION La traduction française de cette page de manuel a été créée par Christophe Blaess , Stéphan Rafin , Thierry Vignaud , François Micaux, Alain Portal , Jean-Philippe Guérard , Jean-Luc Coulon (f5ibh) , Julien Cristau , Thomas Huriaux , Nicolas François , Florentin Duneau , Simon Paillard , Denis Barbier , David Prévot et Frédéric Hantrais . Cette traduction est une documentation libre ; veuillez vous reporter à la .UR https://www.gnu.org/licenses/gpl-3.0.html GNU General Public License version 3 .UE concernant les conditions de copie et de distribution. Il n'y a aucune RESPONSABILITÉ LÉGALE. Si vous découvrez un bogue dans la traduction de cette page de manuel, veuillez envoyer un message à .MT debian-l10n-french@lists.debian.org .ME .