gpt4 book ai didi

c - 交换上下文后出现段错误

转载 作者:行者123 更新时间:2023-11-30 17:22:30 25 4
gpt4 key购买 nike

为什么在执行以下代码时出现段错误?我注意到,如果我声明第二个堆栈( char s2[10000]; 和 init_context2(&unew2, s2, 10000);),一切都会正常。但我不明白为什么需要两个堆栈。是否可以只使用一个,如果可以的话如何?

输出:在上下文初始化之前上下文交换之前信息留言2段错误

#define _GNU_SOURCE
#include <stdio.h>
#include <stdlib.h>
#include <ucontext.h>
ucontext_t uold, unew, unew2;
char s1[10000];

static void message()
{
puts("Message");
}

static void message2()
{
puts("Message2");
}

void init_context(ucontext_t * uc, void* stack, size_t stack_size)
{
//puts("Inside init context");
getcontext(uc);
uc->uc_link = &uold;
uc->uc_stack.ss_sp = stack;
uc->uc_stack.ss_size = stack_size;
uc->uc_stack.ss_flags = 0;
makecontext(uc, message, 0);
}

void init_context2(ucontext_t * uc, void* stack, size_t stack_size)
{
//puts("Inside init context 2");
getcontext(uc);
uc->uc_link = &uold;
uc->uc_stack.ss_sp = stack;
uc->uc_stack.ss_size = stack_size;
uc->uc_stack.ss_flags = 0;
makecontext(uc, message2, 0);
}

int main(int argc, char** argv) {

int i;
for(i=0; i<10; i++)
{
puts("before context init");
init_context(&unew, s1, 10000);
init_context2(&unew2, s1, 10000);
puts("before context swap");
swapcontext(&uold, &unew);
swapcontext(&uold, &unew2);
}

return (EXIT_SUCCESS);
}

最佳答案

原因是您在两个上下文中同时重用堆栈;也就是说,两种上下文都有效。 makecontext 用一些东西初始化堆栈(不确定具体是什么,但可能是链接回前一个上下文的返回地址),因此一个会破坏另一个。

简单地将对 init_context2() 的调用移至第一个上下文运行后即可使程序正常运行:

for(i=0; i<10; i++)
{
puts("before context init");
init_context(&unew, s1, 10000);
puts("before context swap");
swapcontext(&uold, &unew);
init_context2(&unew2, s1, 10000);
swapcontext(&uold, &unew2);
}

关于c - 交换上下文后出现段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28015649/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com