1、文件目录结构如下
三个编辑的文件:ctx.h main.c Makefile
a.out是利用make命令编译之后自动生成的。
2、三个文件的code分别如下:
1)ctx.h
#ifndef __CTX_H__ #define __CTX_H__ typedef unsigned long sigset_t; typedef unsigned int size_t; typedef struct { void *ss_sp; size_t ss_size; int ss_flags; }stack_t; typedef struct mcontext { int gregs[16]; }mcontext_t; typedef struct ucontext { sigset_t uc_sigmask; mcontext_t uc_mcontext; struct ucontext_t *uc_link; stack_t uc_stack; }ucontext_t; int getmcontext (mcontext_t *); void setmcontext (const mcontext_t *); #define setcontext(u) setmcoontext(&((u)->uc_mcontext)) #define getcontext(u) getmcoontext(&((u)->uc_mcontext)) #endif
2)Makefile
.PHONY: all clean CC= gcc all:a.out a.out:main.c ctx.h $(CC) -o $@ $^ clean: rm -rf a.out
3)main.c
#include<stdio.h> #include <unistd.h> #include <ucontext.h> ucontext_t ctx_main, ctx_func1, ctx_func2; void func1 (void) { printf("func1 start\n"); swapcontext (&ctx_func1, &ctx_func2); printf("func1 exit\n"); } void func2 (void) { printf("func2 start\n"); swapcontext (&ctx_func2, &ctx_func1); printf("func2 exit\n"); } int main (void) { int count =0; //用来运行func1 int stack1[1024 * 64]; getcontext (&ctx_func1); printf("count: %d\n",count++); sleep(1); ctx_func1.uc_stack.ss_sp =stack1; ctx_func1.uc_stack.ss_size =1024 * 64; ctx_func1.uc_stack.ss_flags =0; //func1执行完后,跳转回func2,下面这句是后继上下文的意思 ctx_func1.uc_link =&ctx_func2; makecontext (&ctx_func1,func1,0); //用来运行func2 int stack2[1024 * 64]; getcontext (&ctx_func2); printf("count: %d\n",count++); sleep(1); ctx_func2.uc_stack.ss_sp =stack2; ctx_func2.uc_stack.ss_size =1024 * 64; ctx_func2.uc_stack.ss_flags =0; //func2执行完后,跳转回main,下面这句是后继上下文的意思 ctx_func2.uc_link =&ctx_main; makecontext (&ctx_func2,func2,0); swapcontext (&ctx_main, &ctx_func1); printf("main exit\n"); return 0; }
3、编译运行
1)先make编译
#make
2)再运行自动生成的a.out,结果如图
END