是否可以制作jmp_buf的副本并在以后恢复?
之类的东西jmp_buf oldEnv = env;
int val = setjmp(env);
.......
env = oldEnv;
我使用了memcopy()和sizeof(env)来复制jmp_buf数据。这似乎工作正常。这只是巧合吗?
答案 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外观。幸运的是,对于大多数编译器/体系结构对来说,这很容易做到。