swapcontext - Linux

Olivia avatar
By Olivia
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()已用完"的狀態抓出來?

希望有一些強者可以幫我解答

--
Tags: Linux

All Comments

makefile 問題

Dorothy avatar
By Dorothy
at 2011-01-18T01:20
大概像這樣寫吧... all:move gcc xxxxxxxxx move: cp *.h xxx ※ 引述《paulyanzi (消失)》之銘言: : 想請教在 Makefile 中 : 要怎麼去寫,才能讓每次執行 make 動作前都先去做某一個動作? : 我是要每次 make 前把這 ...

geexbox

Hedda avatar
By Hedda
at 2011-01-16T23:07
各位大大好 最近家裡多了很多廢零件 小弟想說廢物利用 就用來組了一台geexbox的播放機 也有用virtualbox試過~能播(iso檔) 690g雙核主機也(光碟開機) 但是小弟想把它弄到usb裡就是失敗 使用軟體unetbootin-windows版的 過程都ok呀 可是就是用usb開機就失敗 ...

gcc 4.4.3 的 optimizations 數量??

Jake avatar
By Jake
at 2011-01-16T17:47
不知道在這邊問適不適合 但我找不到相關的專版XD 我剛裝完Virtual Box 裝了ubuntu 10.04 gcc 4.4.3 因為期末project要去測試gcc的optimization效果 以及使用前後的改善效率 所以我要先知道有哪些optimization才能去下參數要enabl ...

Google OS能擊敗Linux的10大理由

Linda avatar
By Linda
at 2011-01-16T14:45
【大紀元訊】GoogleChrome OS即將於明年上市,這款產品能否對抗Linux?美國IT網站 eWeek撰文稱,GoogleChrome OS在小筆電領域獨具優勢。上市後將在小筆電領域擊敗 Linux和諾基亞,並列舉了10大理由。      雖然Chrome OS尚未上市,但已經在業界引發了軒然大波。這 ...

Win7與CentOS 5.5雙系統問題

Emma avatar
By Emma
at 2011-01-16T14:34
請教各位板大 我的環境為硬碟*1 C為系統磁區,D為資料磁區,系統保留為安裝Win7時產生 利用Win7磁碟管理功能壓縮出了一個50GB未分配的空間供安裝CentOS用 http://0rz.tw/HY8Qm 壓縮完畢後,接著準備安裝CentOS 但問題也來了 第一個新增的磁區可以順利產生(ho ...