我知道setjmp和longjmp的定义。 setjmp将环境存储在堆栈上下文中,另一个恢复。
但我认为在某些方面我的某些方面缺乏理解。有人可以借助好的例子来解释我,我如何保证,如何保存以及如何将其恢复?
我看到jmp_buf中有很多CPU寄存器。但我如何确保它恢复?
请帮我用简洁的例子来解释。我用谷歌搜索并提到堆栈溢出的其他问题,但没有一个给出明确的例子。
提前非常感谢。
P.S:它应该仅来自Linux / Unix上下文。
答案 0 :(得分:7)
调用longjmp()
时,所有这些寄存器都会自动恢复,并在相应的setjmp()
调用时继续执行,但这次setjmp()
具有不同的返回值(类似于{ {1}}在父级和子级中具有不同的返回值。
fork()
/ setjmp()
只保存有限的环境。特别是,它们只保存堆栈指针,而不是完整堆栈,因此您只能返回相同的函数或调用函数。 POSIX具有longjmp()
,允许在堆栈之间切换,使其更加直接用于实现用户空间线程(原纤维,绿线程......等)。