保存&复制jmp_buf C ++

时间:2015-09-24 02:04:12

标签: c++ longjmp setjmp

是否可以制作jmp_buf的副本并在以后恢复?

之类的东西
jmp_buf oldEnv = env;
int val = setjmp(env);
.......
env = oldEnv;

我使用了memcopy()和sizeof(env)来复制jmp_buf数据。这似乎工作正常。这只是巧合吗?

3 个答案:

答案 0 :(得分:1)

根据http://en.cppreference.com/w/c/program/jmp_buf,未指定jmp_buf的类型。因此,当您实际使用jmp_buf时,您不知道自己会得到什么,并且sizeof可能无法返回您记忆中的存储空间的实际大小。想要复制。 memcpy和sizeof可能会起作用,但由于你不确定,你可能会遇到各种各样的错误。

这也引出了为什么要复制它的问题? jmp_buf的内容根本不应该被你使用。您正在做的所有事情是在setjmp填充env时为操作系统提供存储空间。就像Ron Popeil所说的那样,#34;设置并忘记它。"

答案 1 :(得分:1)

只有在过渡期间不对jmp_buf做任何事情,才能做到这一点。最值得注意的是,您无法再次致电setjmp,恢复旧jmp_buf内容,并使用longjmp返回之前的setjmp来电。

C标准中的规则:

  

longjmp函数在相同的程序调用中使用相应的setjmp参数恢复最新调用jmp_buf所保存的环境

因为jmp_buf是"数组类型",对longjmp的调用实际上是传递了一个衰减的指针;它是jmp_buf的实际地址,上述措词涉及"对应的jmp_buf参数"参考,而不仅仅是它的内容。

我不知道标准如何保证您将返回到最近setbuf的上下文,如果您正在查看{{1}的内容所以我会对jmp_buf的任何修改进行处理,使其完全无法用于jmp_buf目的。

如果您对特定平台上的内部布局有所了解,并且您正在使用longjmp来保存处理器上下文以进入调试日志,那么这样就可以了。但副本无法与jmp_buf一起使用。

答案 2 :(得分:0)

安全地执行此操作的唯一方法是实现您自己的setjmp/longjmp外观。幸运的是,对于大多数编译器/体系结构对来说,这很容易做到。