linux - setjmp 和 longjmp - 通过示例理解

标签 linux unix setjmp

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

但我认为我在某些地方缺乏理解。有人可以在很好的例子的帮助下向我解释我如何保证、如何保存以及如何恢复吗?

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

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

非常感谢。

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

最佳答案

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

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

关于linux - setjmp 和 longjmp - 通过示例理解,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6890892/

相关文章:

c - make 使用 autotools 给出 undefined reference 错误,而自定义 Makefile 工作正常

bash - 检查一个目录是否包含另一个目录

linux - 通过shell脚本替换节点

macos - 如何在命令行上获取 bash 子进程的进程 ID

exception - OCaml 内部结构 : Exceptions

c - 在 C 中,如果我的函数出现 longjmp "passes through",有什么方法可以清理吗?

Linux使用 "select: Bad file descriptor"后返回 "cat"错误

linux - 使用 GStreamer 连接到 PulseAudio 流

linux - Izpack 控制台安装

c - 在 sleep() 中退出 pthread 时如何消除错误?