setjmp和longjmp – 用例子理解

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

但是我觉得我有一些地方有些缺乏理解。 有人可以解释我吗,借助一些很好的例子,我该如何保证,如何保存以及如何恢复?

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

请帮助我用简洁的例子来解释。 我search了一下,并提到了堆栈溢出的其他问题,但都没有给出明确的例子。

巨大的巨大感谢提前。

PS:它应该只来自Linux / Unix环境。

Solutions Collecting From Web of "setjmp和longjmp – 用例子理解"

当调用longjmp() ,所有这些寄存器都会自动恢复,并且继续执行相应的setjmp()调用,但是这次setjmp()具有不同的返回值(类似于fork()在父类中具有不同的返回值儿童)。

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