Be myself :: 리눅스 c로 coroutines 구현

달력

32024  이전 다음

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
#include <stdio.h>
#include <stdlib.h>
#include <ucontext.h>
#define MEM 64000

ucontext_t T1, T2, Main;
ucontext_t a;

int fn1()
{
  printf("this is from 1\n");
  setcontext(&Main);
}

void fn2()
{
  printf("this is from 2\n");
  setcontext(&a);
  printf("finished 1\n");
}

void start()
{
  getcontext(&a);
  a.uc_link=0;
  a.uc_stack.ss_sp=malloc(MEM);
  a.uc_stack.ss_size=MEM;
  a.uc_stack.ss_flags=0;
  makecontext(&a, (void*)&fn1, 0);
}

int main(int argc, char *argv[])
{
  start();
  getcontext(&Main);
  getcontext(&T1);
  T1.uc_link=0;
  T1.uc_stack.ss_sp=malloc(MEM);
  T1.uc_stack.ss_size=MEM;
  makecontext(&T1, (void*)&fn1, 0);
  swapcontext(&Main, &T1);

  getcontext(&T2);
  T2.uc_link=0;
  T2.uc_stack.ss_sp=malloc(MEM);
  T2.uc_stack.ss_size=MEM;
  T2.uc_stack.ss_flags=0;
  makecontext(&T2, (void*)&fn2, 0);
  swapcontext(&Main, &T2);
  printf("completed\n");
  exit(0);
}

[결과]

flack3r@ubuntu:/mnt/hgfs/Ctf$ ./test
this is from 1
this is from 2
this is from 1
completed


[*]주의 : swapcontext 와 setcontext의 역할은 비슷하지만 swapcontext는 현재 context정보를 첫번째 인자에 저장한 후 두번째 인자로 context가 변경되고 setcontext는 현재 context가 첫번째 인자로 바뀐다.

참조:http://stackoverflow.com/questions/21468529/context-switching-ucontext-t-and-makecontext

'memo' 카테고리의 다른 글

문자열 함수들 특징  (0) 2015.03.22
strcpy에 대한 팁.!  (0) 2015.03.10
qemu를 이용한 arm system 설치  (1) 2014.12.26
Posted by flack3r
|