setjmp() と longjmp()

システム・プログラム

                                       電子・情報工学系
                                       新城 靖
                                       <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

■setjmp() と longjmp()

関数間でも有効な goto がある。

割り込み処理やエラー回復に便利である。しかし、マルチスレッドの時代には、 少し合わない。回復できない例外処理に相当する。C++やJavaの例外の 扱いに大きな影響を与えている。


----------------------------------------------------------------------
   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-longjmp [←]
setjmp(), first time. x == 0
f() called.
g() called.
h() called.
longjmp( main_env,10 )
return from longjmp(), x == 10 
% []
----------------------------------------------------------------------


↑[もどる] ←[5月08日] ・[5月15日] [課題]
Last updated: 2000/05/14 18:25:10
Yasushi Shinjo / <yas@is.tsukuba.ac.jp>