我知道 setjmp 和 longjmp 的定义。 setjmp 将环境存储在堆栈上下文中,另一个恢复。
但我认为我在某些地方缺乏理解。有人可以在很好的例子的帮助下向我解释我如何保证、如何保存以及如何恢复吗?
我看到jmp_buf中指向了很多CPU寄存器。但我如何确保它已恢复?
请帮助我用简洁的示例进行解释。我用谷歌搜索并提到了其他与堆栈溢出有关的问题,但没有一个给出明确的例子。
非常感谢。
P.S:它应该仅来自 Linux/Unix 上下文。
最佳答案
当调用 longjmp()
时,所有这些寄存器都会自动恢复,并在对 setjmp()
的相应调用处继续执行,但是这次 setjmp( )
有不同的返回值(类似于 fork()
在父子中有不同的返回值)。
setjmp()
/longjmp()
只保存有限的环境。特别是,它们只保存堆栈指针,而不是整个堆栈,因此您只能返回同一个函数或调用函数。 POSIX 有 setcontext()
,它允许在堆栈之间切换,使其更直接地用于实现用户空间线程(原纤维、绿色线程等)之类的东西。
关于linux - setjmp 和 longjmp - 通过示例理解,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6890892/