setjmp和longjmp - 用例子理解

时间:2011-07-31 16:58:02

标签: linux unix longjmp setjmp

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

但我认为在某些方面我的某些方面缺乏理解。有人可以借助好的例子来解释我,我如何保证,如何保存以及如何将其恢复?

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

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

提前非常感谢。

P.S:它应该仅来自Linux / Unix上下文。

1 个答案:

答案 0 :(得分:7)

调用longjmp()时,所有这些寄存器都会自动恢复,并在相应的setjmp()调用时继续执行,但这次setjmp()具有不同的返回值(类似于{ {1}}在父级和子级中具有不同的返回值。

fork() / setjmp()只保存有限的环境。特别是,它们只保存堆栈指针,而不是完整堆栈,因此您只能返回相同的函数或调用函数。 POSIX具有longjmp(),允许在堆栈之间切换,使其更加直接用于实现用户空间线程(原纤维,绿线程......等)。