setjmp和longjmp - 用例子理解

kin*_*er1 7 unix linux longjmp setjmp

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

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

我看到jmp_buf中有很多CPU寄存器.但我怎么保证它恢复了?

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

非常感谢提前.

PS:它应该仅来自Linux/Unix上下文.

nin*_*alj 7

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

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