システム・プログラム 電子・情報工学系 新城 靖 <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 %
----------------------------------------------------------------------