练习6.2“Linux的编程接口”,由迈克尔·凯里斯克问:`longjmp`成终止函数
写一个程序,看看我们是否尝试
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 start\n");
switch (setjmp(env)) {
case 0:
printf("foo branch 0\n");
break;
case 1:
printf("foo branch 1\n");
break;
}
printf("foo end\n");
return;
}
void
bar (void)
{
printf("bar start\n");
baz();
printf("bar end\n");
return;
}
void
baz (void)
{
printf("baz start\n");
longjmp(env, 1);
printf("baz end\n");
return;
}
相反,这种打印:
$ ./setjmp
foo start
foo branch 0
foo end
bar start
baz start
foo branch 1
foo end
也就是说,如果foo
没有终止我本来期望的行为。这是为什么?如何修改我的程序以实现longjmp
到终止函数?
我不明白这个问题。你的任务是写一个程序来看看会发生什么。你做到了。你看到会发生什么。所以有什么问题? –
我有一种感觉,Kerrisk先生指的是foo()中局部变量的值可能已经被foo()初始终止后使用相同堆栈空间的其他函数潦草写下。 foo()中的_control flow_在你将'longjmp()'放回去的时候仍然是一样的。 –
也许这会有所帮助:如果调用'foo'传入一整堆参数,并且'foo'初始化一堆局部变量,然后在跳转后打印出当地人和形式文件,你会怎么想呢? –