[問題]swapcontext

看板LinuxDev作者 (scrya)時間15年前 (2011/01/18 23:44), 編輯推噓0(000)
留言0則, 0人參與, 最新討論串1/2 (看更多)
對於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()已用完"的狀態抓出來? 希望有一些強者可以幫我解答 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 111.251.188.27
文章代碼(AID): #1DDRLRXR (LinuxDev)
討論串 (同標題文章)
以下文章回應了本文
1
1
完整討論串 (本文為第 1 之 2 篇):
1
1
文章代碼(AID): #1DDRLRXR (LinuxDev)