8

我知道setjmp和longjmp的定义。setjmp 将环境存储在堆栈上下文中,另一个进行恢复。

但我认为我在某些地方缺乏理解。有人可以在很好的例子的帮助下向我解释我如何保证,它将如何保存以及如何恢复?

我看到 jmp_buf 中有很多 CPU 寄存器。但我如何保证它已恢复?

请用简洁的例子帮助我解释。我用谷歌搜索并提到了堆栈溢出的其他问题,但没有一个给出明确的例子。

非常感谢提前。

PS:它应该只来自 Linux/Unix 上下文。

4

1 回答 1

8

调用时longjmp(),所有这些寄存器都会自动恢复,并在相应的调用处继续执行setjmp(),但这次setjmp()有不同的返回值(类似于fork()parent 和 child 的返回值不同)。

setjmp()/longjmp()只保存有限的环境。特别是,它们只保存堆栈指针,而不是完整堆栈,因此您只能返回相同的函数或调用函数。POSIX 具有setcontext(),它允许在堆栈之间切换,使其更直接地用于实现诸如用户空间线程(fibrils、green-threads,...)之类的东西。

于 2011-07-31T17:36:40.713 回答