setcontext()分段错误

时间:2016-01-30 00:08:26

标签: c segmentation-fault

我正在尝试使用C中的上下文切换来创建自定义pthread库。当我调用setcontext()时,我遇到了获取分段错误的问题 - 这个函数的文档似乎有限,所以我可以'我真的知道发生了什么,这已经花了我很多停机时间。我的代码:

#include <signal.h>
#include <ucontext.h>

struct mypthread_t{
   int id;
   int pid;
   int isRunning;
   mypthread_t *next;
   ucontext_t* context;
}; 

int mypthread_create(mypthread_t *thread, const mypthread_attr_t *attr, void *(*start_routine)(void *), void *arg)
{
   printf("Hello\n");
   thread->id = threadID++;
   thread->context = malloc(sizeof(ucontext_t));
   thread->context->uc_stack.ss_sp = malloc(16384);
   thread->context->uc_stack.ss_size = 16384;
   thread->context->uc_link = 0;

   makecontext(thread->context, (void *) start_routine, 1, arg);
   setcontext(thread->context);
}

似乎我已经完成了malloc所需的所有内容,所以我不明白为什么setcontext(thread-&gt; context)给我一个段错误。任何帮助将不胜感激 - 功能的上下文系列真的让我很难过。这是从gdb失败的那一行:

fldenv  (%rcx)

1 个答案:

答案 0 :(得分:3)

在致电ucontext_t之前致电getcontext(3)初始化您的makecontext(3)对象:

if (getcontext(thread->context) == -1) {
    // ... error handling
    // ... errno is set appropriately to indicate the error that occurred
}
makecontext(...);