我正在尝试使用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)
答案 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(...);