C++/C<ucontext.h>协程调试过程中遇到的wenti

新手上路,请多包涵

今天使用<ucontext.h>下的函数想试着搞一下协程。但是发现一个奇怪的现象。

#include<iostream>
#include<ucontext.h>
#include<unistd.h>
using namespace std;

void function(){
    cout<<"run this"<<endl;
    //sleep(1);
    return;
}

void function2(){
    cout<<"I am yuhaoxiao."<<endl;
    return;
}

int main(){
    cout<<"in main"<<endl;
    char stack[1024],stack2[1024];
    ucontext_t main,other,func;
    getcontext(&main);

    getcontext(&func);

    func.uc_stack.ss_sp=stack2;
    func.uc_stack.ss_size=sizeof(stack2);
    func.uc_stack.ss_flags=0;
    func.uc_link=&other;

    makecontext(&func,function2,0);

    main.uc_stack.ss_sp=stack;
    main.uc_stack.ss_size=sizeof(stack);
    main.uc_stack.ss_flags=0;
    main.uc_link=&func;
    
    makecontext(&main,function,0);
    cout<<"test flag 1"<<endl;
    swapcontext(&other,&main);
    //setcontext(&main);
    cout<<"in main"<<endl;
    return 0;
}

调试代码如上。
在上述代码中,function()函数中带上sleep(1)后运行会出现segmentation fault,但是不带sleep(1)则可以运行成功。
image.png
想问一下各位大神是因为什么原因。

阅读 4.1k
2 个回答

这个程序我编译运行没有segment fault.你那里是必现的吗?我将你贴上来的代码去掉函数function中的sleep注释,编译运行,没有问题。
g++ :g++ (Ubuntu 7.4.0-1ubuntu1~18.04.1) 7.4.0

另外你这个程序有点乱,跳转不是很直观,程序中变量命名也有点随意,不能见名知意。
可以参考我收藏的一篇笔记,相对清晰一些。
协程-C语言实现

如果你发现有问题可以评论告知,我这里没运行出来segment fault.

stack 太小了,调用 sleep(1) 需要1千多字节的栈空间。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题