Michael Kerrisk在“The Linux Programming Interface”中练习6.2:
编写一个程序,看看如果我们尝试longjmp()到已经终止的函数会发生什么。我以为这个程序应该做的伎俩:#include <setjmp.h> #include <stdio.h> #include <stdlib.h> static jmp_buf env; void foo (void); void bar (void); void baz (void); int main (int argc,char *argv[]) { foo(); bar(); exit(EXIT_SUCCESS); } void foo (void) { printf("foo startn"); switch (setjmp(env)) { case 0: printf("foo branch 0n"); break; case 1: printf("foo branch 1n"); break; } printf("foo endn"); return; } void bar (void) { printf("bar startn"); baz(); printf("bar endn"); return; } void baz (void) { printf("baz startn"); longjmp(env,1); printf("baz endn"); return; }相反,这打印:使用Linux套接字API快速重新连接到RFCOMM蓝牙设备GDBdebugging中的问题在Linux上创buildprimefaces文件?如何使用LowLevelKeyboardHook挂钩Win + TabVim + OmniCppComplete:完成对STL容器的类成员$ ./setjmp foo start foo branch 0 foo end bar start baz start foo branch 1 foo end也就是说,如果foo没有终止的话,我会预期这种行为。 这是为什么? 我如何修改我的程序来实现longjmp到终止函数?Linux下C ++audio捕获API的最佳实践?fwrite()向输出添加垃圾数据(WINE&Windows 7,mingw&MSVC;不是linux / gcc)听多次调用套接字 – 预期的行为?在ubuntu中使用make命令重新编译问题Process.GetCurrentProcess()。MainWindowHandle返回零维基百科 。 拿一粒盐。跳转到已经由return或longjmp终止的函数是未定义的。[6] 但是,大多数longjmp的实现在执行跳转时不会特别销毁局部变量。 由于上下文一直存在直到其局部变量被擦除,实际上它可以通过setjmp来恢复。幸运的是,他们确实引用了(虽然是旧的)标准。§7.13.2.1/ 2longjmp函数通过相应的jmp_buf参数来恢复程序调用时最近一次调用setjmp宏所保存的环境。 如果没有这样的调用, 或者包含调用setjmp宏的函数已经终止了执行( 211)
,或者如果setjmp宏的调用在具有可变修改类型和执行的标识符的范围内在此期间留下这个范围, 行为是不确定的。211)例如,通过执行一个return语句,或者因为另一个longjmp调用已经导致传递给一组嵌套调用中的一个函数中的setjmp调用。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。