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