2012-03-19 41 views
1

我試圖創建一個使用swapcontext()一個簡單的Hello World例子swapcontext()分段錯誤

這裏是代碼片段:

#include <ucontext.h> 
#include <stdio.h> 
#include <stdlib.h> 

static ucontext_t uctx_main, uctx_func1; 

typedef struct test_struct 
{ 
    ucontext_t context; 
    int value; 
}test_struct; 

test_struct* array[10]; 

static void 
func1(void) 
{ 
    printf("func1: started\n"); 
    printf("func1: TESTING\n"); 
    printf("func1: returning\n"); 
} 
void init() 
{ 
    memset(array,NULL,10); 

    array[0] = (test_struct*)malloc(sizeof(test_struct)); 
    array[0]->value = 10; 

    getcontext(&array[0]->context); 

    char* func1_stack = (char*)malloc(sizeof(char)*64); 
    //char func1_stack[64]; 

    array[0]->context.uc_stack.ss_sp = func1_stack; 
    array[0]->context.uc_stack.ss_size = 64; 
    array[0]->context.uc_link = &uctx_main; 

    makecontext(&array[0]->context, func1, 0); 
} 

int main(int argc, char *argv[]) 
{ 
    init(); 

    printf("VALUE: %d\n",array[0]->value); 

    swapcontext(&uctx_main, &array[0]->context); 

    printf("VALUE: %d\n",array[0]->value); 
    printf("main: exiting\n"); 
    exit(0); 
} 

但問題是,當編程'執行swapcontext()分割發生故障。我已經弄清楚了一點,我發現問題在於我分配給上下文的堆棧大小,但是我不知道我在做什麼錯誤。

P.S.我曾嘗試分配sizeof(func1_stack)但仍然有段故障

任何人都可以給我一個提示嗎?

回答

2

使用64作爲編碼的堆棧大小與實際給定的堆棧大小一致。但是,堆棧的64個字節相當小。 example here使用16K作爲堆棧大小。這可能是因爲你使用的尺寸太小。因此,memset可能是不正確的。它設置數組的前10個字節。它實際上並沒有影響任何東西,但它可能應該是以下內容:

memset(array,0,sizeof(array))); 
+0

看來堆棧大小對我來說是個問題,謝謝 – 2012-10-17 17:08:37