使用线程库中的getcontext()进行分段错误

我正在尝试使用系统调用(例如get context,swap context等)在C中实现用户级线程库

我有一个如下所示的线程控制块:

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-> thread_context)函数中遇到了分段错误。

我已经阅读了getcontext()的手册页,但我不确定为什么这会给我返回一个分段错误!

有什么建议吗?

你还没有为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); } 

我们可以获得有关getcontext / setcontext “GNU C库参考手册章节:23非本地人退出,页面622”的以下信息,并找到以下信息

在为堆栈分配内存时,必须要小心。 大多数现代处理器都会跟踪某个内存区域是否允许包含已执行或未执行的代码。 通常不会标记数据段和堆内存以允许此操作。 结果是程序会失败 。 此类代码的示例包括GNU C编译器为调用嵌套函数而生成的调用序列。 正确分配堆栈的安全方法包括在原始线程堆栈上使用内存或使用内存映射I / O显式分配标记为执行的内存。

这导致了问题,您应该使用建议的步骤来分配内存(使用内存映射I / O有关更多信息,请参阅libc手册)。