2014-04-15 30 views
2

我試圖實現下使用系統用戶級線程庫調用,例如獲取上下文,交換上下文等段錯誤使用的getContext()的線程庫

我有一個線程控制塊,看起來像這樣:

struct tcb { 
    int thread_id; 
    int thread_pri; 
    ucontext_t *thread_context; 
    struct tcb *next; 
} 

而且我有一個函數調用的init(),看起來像這樣:

void t_init() 
{ 
    tcb *tmp; 
    tmp = malloc(sizeof(tcb)); 

    getcontext(tmp->thread_context); /* let tmp be the context of main() */ 
running_head = tmp; 
} 

我用gdb,我在的getContext了運行時分段故障(TMP-> THR ead_context)函數。

我已閱讀getcontext()的手冊頁,但我不確定爲什麼這會向我返回一個分段錯誤!

有什麼建議嗎?

+0

檢查'malloc'返回的指針。 – brokenfoot

+0

但我在getcontext()調用時出錯。 malloc的手冊頁建議一個void *,如果sizeof是NULL,否則可以傳遞給free()的ptr。我在這裏做錯了什麼? – pypep278

回答

3

您還沒有分配的任何空間thread_context,嘗試

void t_init() 
{ 
    struct tcb *tmp; 
    tmp = malloc(sizeof(struct tcb)); 
    if (!tmp) 
     return -1; 

    memset(&tmp, 0, sizeof(struct tcb)); 
    tmp->thread_context = malloc(sizeof(ucontext_t)); 
    if (!tmp->thread_context) 
     return -1; 

    getcontext(tmp->thread_context); 
} 
+0

感謝您的幫助! – pypep278

+0

注意:爲簡潔起見,這裏沒有清理,至少'free(tmp)'如果thread_context分配失敗 – austinmarton

0

我們可以得到如下信息有關getcontext/setcontext「GNU C庫參考手冊第一章:23名非當地人退出,頁622)」,並發現以下內容

雖然爲堆棧分配內存必須小心。 大多數現代處理器都會跟蹤某個內存區域是否被允許包含執行或不執行的代碼。數據段和 堆內存通常不標記爲允許此操作。結果是 程序將失敗。此類代碼的示例包括GNU C編譯器爲調用嵌套函數而生成的調用 序列。 正確分配堆棧的安全方法包括在原始線程堆棧上使用內存,或使用內存映射I/O明確分配標記爲 執行的內存。

這是造成這個問題,你應該使用推薦的步驟來分配內存(使用內存映射的I/O有關更多信息,請參閱libc手冊)。