システム・プログラム
電子・情報工学系
新城 靖
<yas@is.tsukuba.ac.jp>
このページは、次の URL にあります。
http://www.hlla.is.tsukuba.ac.jp/~yas/coins/syspro-2000/2000-05-15
あるいは、次のページから手繰っていくこともできます。
http://www.hlla.is.tsukuba.ac.jp/~yas/coins/
http://www.is.tsukuba.ac.jp/~yas/index-j.html
関数間でも有効な goto がある。
----------------------------------------------------------------------
1: /*
2: setjmp-longjmp.c -- setjmp() と longjmp() のテスト
3: ~yas/syspro1/proc/setjmp-longjmp.c
4: $Header: /home/lab2/OS/yas/syspro1/proc/RCS/setjmp-longjmp.c,v 1.2 1998/06/15 12:33:57 yas Exp $
5: Start: 1997/05/26 20:26:27
6: */
7:
8: #include <setjmp.h>
9:
10: extern void f(void);
11: extern void g(void);
12: extern void h(void);
13:
14: jmp_buf main_env ;
15:
16: main()
17: {
18: int x ;
19: if( (x=setjmp(main_env)) == 0 )
20: {
21: printf("setjmp(), first time. x == %d\n",x );
22: f();
23: }
24: else
25: {
26: printf("return from longjmp(), x == %d \n",x );
27: }
28: }
29:
30: void f()
31: {
32: printf("f() called.\n");
33: g();
34: printf("f() return.\n");
35: }
36:
37: void g()
38: {
39: printf("g() called.\n");
40: h();
41: printf("h() return.\n");
42: }
43:
44: void h()
45: {
46: printf("h() called.\n");
47: printf("longjmp( main_env,10 )\n");
48: longjmp( main_env,10 );
49: printf("h() return.\n");
50: }
----------------------------------------------------------------------
実行例。
---------------------------------------------------------------------- % ./setjmp-longjmpsetjmp(), first time. x == 0 f() called. g() called. h() called. longjmp( main_env,10 ) return from longjmp(), x == 10 %
----------------------------------------------------------------------