Find centralized, trusted content and collaborate around the technologies you use most.
Teams
Q&A for work
Connect and share knowledge within a single location that is structured and easy to search.
我知道setjmp和longjmp的定义。setjmp 将环境存储在堆栈上下文中,另一个进行恢复。
但我认为我在某些地方缺乏理解。有人可以在很好的例子的帮助下向我解释我如何保证,它将如何保存以及如何恢复?
我看到 jmp_buf 中有很多 CPU 寄存器。但我如何保证它已恢复?
请用简洁的例子帮助我解释。我用谷歌搜索并提到了堆栈溢出的其他问题,但没有一个给出明确的例子。
非常感谢提前。
PS:它应该只来自 Linux/Unix 上下文。
调用时longjmp(),所有这些寄存器都会自动恢复,并在相应的调用处继续执行setjmp(),但这次setjmp()有不同的返回值(类似于fork()parent 和 child 的返回值不同)。
longjmp()
setjmp()
fork()
setjmp()/longjmp()只保存有限的环境。特别是,它们只保存堆栈指针,而不是完整堆栈,因此您只能返回相同的函数或调用函数。POSIX 具有setcontext(),它允许在堆栈之间切换,使其更直接地用于实现诸如用户空间线程(fibrils、green-threads,...)之类的东西。
setcontext()