swapcontext - Linux

By Olivia
at 2011-01-18T23:45
at 2011-01-18T23:45
Table of Contents
※ [本文轉錄自 LinuxDev 看板 #1DDRLRXR ]
作者: yueayase (scrya) 看板: LinuxDev
標題: [問題]swapcontext
時間: Tue Jan 18 23:44:25 2011
對於swapcontext()這個function,修改以下code(從linux man page):
#include <ucontext.h>
#include <stdio.h>
#include <stdlib.h>
static ucontext_t uctx_main, uctx_func1, uctx_func2;
#define die(msg) do { perror(msg); exit(EXIT_FAILURE); } while (0)
static void
func1(void)
{
printf("func1: started\n");
printf("func1: swapcontext(&uctx_func1, &uctx_func2)\n");
if (swapcontext(&uctx_func1, &uctx_func2) == -1)
die("swapcontext");
/* 有趣的地方 */
printf("test...\n");
if (swapcontext(&uctx_func1, &uctx_func2) == -1)
die("swapcontext");
printf("func1: returning\n");
}
static void
func2(void)
{
printf("func2: started\n");
printf("func2: swapcontext(&uctx_func2, &uctx_func1)\n");
if (swapcontext(&uctx_func2, &uctx_func1) == -1)
die("swapcontext");
printf("func2: returning\n");
}
int
main(int argc, char *argv[])
{
char func1_stack[16384];
char func2_stack[16384];
if (getcontext(&uctx_func1) == -1)
die("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)
die("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)\n");
if (swapcontext(&uctx_main, &uctx_func2) == -1)
die("swapcontext");
printf("main: exiting\n");
exit(EXIT_SUCCESS);
}
如果照原本的,會有下列結果
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
可是如果在第一次swapcontext()後加了
if (swapcontext(&uctx_func1, &uctx_func2) == -1)
die("swapcontext");
結果變成
main: swapcontext(&uctx_main, &uctx_func2)
func2: started
func2: swapcontext(&uctx_func2, &uctx_func1)
func1: started
func1: swapcontext(&uctx_func1, &uctx_func2)
test...
func2: returning
怪了,不是應該回到func1()去嗎?
怎麼main() 和 func1()都沒有作用呢?
如果一個function已經結束,再做一次swapcontext()
好像會產生這樣的結果,
我很好奇,怎麼把這種"func2()已用完"的狀態抓出來?
希望有一些強者可以幫我解答
--
作者: yueayase (scrya) 看板: LinuxDev
標題: [問題]swapcontext
時間: Tue Jan 18 23:44:25 2011
對於swapcontext()這個function,修改以下code(從linux man page):
#include <ucontext.h>
#include <stdio.h>
#include <stdlib.h>
static ucontext_t uctx_main, uctx_func1, uctx_func2;
#define die(msg) do { perror(msg); exit(EXIT_FAILURE); } while (0)
static void
func1(void)
{
printf("func1: started\n");
printf("func1: swapcontext(&uctx_func1, &uctx_func2)\n");
if (swapcontext(&uctx_func1, &uctx_func2) == -1)
die("swapcontext");
/* 有趣的地方 */
printf("test...\n");
if (swapcontext(&uctx_func1, &uctx_func2) == -1)
die("swapcontext");
printf("func1: returning\n");
}
static void
func2(void)
{
printf("func2: started\n");
printf("func2: swapcontext(&uctx_func2, &uctx_func1)\n");
if (swapcontext(&uctx_func2, &uctx_func1) == -1)
die("swapcontext");
printf("func2: returning\n");
}
int
main(int argc, char *argv[])
{
char func1_stack[16384];
char func2_stack[16384];
if (getcontext(&uctx_func1) == -1)
die("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)
die("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)\n");
if (swapcontext(&uctx_main, &uctx_func2) == -1)
die("swapcontext");
printf("main: exiting\n");
exit(EXIT_SUCCESS);
}
如果照原本的,會有下列結果
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
可是如果在第一次swapcontext()後加了
if (swapcontext(&uctx_func1, &uctx_func2) == -1)
die("swapcontext");
結果變成
main: swapcontext(&uctx_main, &uctx_func2)
func2: started
func2: swapcontext(&uctx_func2, &uctx_func1)
func1: started
func1: swapcontext(&uctx_func1, &uctx_func2)
test...
func2: returning
怪了,不是應該回到func1()去嗎?
怎麼main() 和 func1()都沒有作用呢?
如果一個function已經結束,再做一次swapcontext()
好像會產生這樣的結果,
我很好奇,怎麼把這種"func2()已用完"的狀態抓出來?
希望有一些強者可以幫我解答
--
Tags:
Linux
All Comments
Related Posts
makefile 問題

By Dorothy
at 2011-01-18T01:20
at 2011-01-18T01:20
geexbox

By Hedda
at 2011-01-16T23:07
at 2011-01-16T23:07
gcc 4.4.3 的 optimizations 數量??

By Jake
at 2011-01-16T17:47
at 2011-01-16T17:47
Google OS能擊敗Linux的10大理由

By Linda
at 2011-01-16T14:45
at 2011-01-16T14:45
Win7與CentOS 5.5雙系統問題

By Emma
at 2011-01-16T14:34
at 2011-01-16T14:34