La commutation de contexte - ucontext_t et makecontext()
Je suis l'étude de la commutation de contexte dans la programmation en C et ont trouvé l'exemple de code suivant sur l'Internet. Je suis à essayer de comprendre si seulement makecontext()
fonction peut déclencher une fonction qui fait quelque chose. Les autres fonctions telles que setcontext()
, getcontext()
, et swapcontext()
sont utilisés pour établir le contexte.
La makecontext()
attache une fonction et son paramètre(s) à un contexte, la fonction de controle pour le contexte, tout le temps jusqu'à ce qu'un changement s'est engagée à elle?
1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <ucontext.h>
4 #define MEM 64000
5
6 ucontext_t T1, T2, Main;
7 ucontext_t a;
8
9 int fn1()
10 {
11 printf("this is from 1\n");
12 setcontext(&Main);
13 }
14
15 void fn2()
16 {
17 printf("this is from 2\n");
18 setcontext(&a);
19 printf("finished 1\n");
20 }
21
22 void start()
23 {
24 getcontext(&a);
25 a.uc_link=0;
26 a.uc_stack.ss_sp=malloc(MEM);
27 a.uc_stack.ss_size=MEM;
28 a.uc_stack.ss_flags=0;
29 makecontext(&a, (void*)&fn1, 0);
30 }
31
32 int main(int argc, char *argv[])
33 {
34 start();
35 getcontext(&Main);
36 getcontext(&T1);
37 T1.uc_link=0;
38 T1.uc_stack.ss_sp=malloc(MEM);
39 T1.uc_stack.ss_size=MEM;
40 makecontext(&T1, (void*)&fn1, 0);
41 swapcontext(&Main, &T1);
42 getcontext(&T2);
43 T2.uc_link=0;
44 T2.uc_stack.ss_sp=malloc(MEM);
45 T2.uc_stack.ss_size=MEM;
46 T2.uc_stack.ss_flags=0;
47 makecontext(&T2, (void*)&fn2, 0);
48 swapcontext(&Main, &T2);
49 printf("completed\n");
50 exit(0);
51 }
Vous devez vous connecter pour publier un commentaire.
makecontext
écrit la fonction info dans un contexte, et il y restera jusqu'à ce qu'il soit remplacé par quelque chose d'autre.getcontext
overwites de l'ensemble du contexte, donc, serait de remplacer n'importe quelle fonction écrite par un appel précédent àmakecontext
. De même,swapcontext
remplace le contexte pointée par son premier argument.L'idée de base est qu'un
u_context
contient un instantané d'une partie du contexte de processus dans le temps. Il contient tous les registres de la machine, pile info, de signal et de masques. Il n'inclut PAS la carte mémoire ou le fichier descripteur de l'état. L'état dans leu_context
est précisément tout l'état vous avez besoin pour manipuler afin de mettre en oeuvre des threads ou des coroutines.modifier
swapcontext(¤t, &another)
enregistre le contexte actuel danscurrent
et les commutateurs àanother
. À un moment plus tard, le code (runnning deanother
contexte) peut revenir àcurrent
(avec un autre appel àswapcontext
) ou il peut passer à une troisième contexte.Dans un contexte extrémités (la fonction en elle avec
makecontext
retours), si le contexte est pointée par sonuc_link
champ, il va changer à ce contexte. Mais siuc_link
est NULLE, alors le thread (processus et si il n'y a qu'un seul thread) va quitter -- autres contextes qui ne sont pas en cours d'exécution juste être abandonné.