SETJMP(3) FreeBSD ライブラリ関数マニュアル SETJMP(3)
名称
sigsetjmp, siglongjmp, setjmp, longjmp, _setjmp, _longjmp, longjmperror − 非局所分岐 |
ライブラリ
標準 C ライブラリ (libc, −lc) |
書式
#include <setjmp.h> int |
sigsetjmp(sigjmp_buf env, int savemask); void |
siglongjmp(sigjmp_buf env, int val); int |
setjmp(jmp_buf env); void |
longjmp(jmp_buf env, int val); int |
_setjmp(jmp_buf env); void |
_longjmp(jmp_buf env, int val); void |
longjmperror(void); |
解説 |
sigsetjmp(), setjmp() および _setjmp() 関数は、呼び出し元の環境を env に 保存します。これらの関数はどれも 0 を返します。 対応する longjmp() 関数は、それぞれ最も新しい setjmp() 関数呼び出しによっ て保存された環境を復元します。 longjmp() 関数はその後で復帰するので、対応 する setjmp() 呼び出しが、0 ではなく val で指定された値を返したばかりであ るかのようにプログラムの実行が継続します。 呼び出しのペアはお互いに混合できます。すなわち、 sigsetjmp() と siglongjmp() および setjmp() と longjmp() の各組み合わせは、同じプログラ ム内で使用できます。しかし、個々の呼び出しは混合することはできません。た とえば、 setjmp() に渡される env 引数は siglongjmp() に渡すことはできませ ん。 longjmp() ルーチンは、 setjmp() を呼び出したルーチンから復帰した後では呼 び出すことはできません。 アクセス可能なオブジェクトはすべて longjmp() ルーチンが呼び出された時点で の値を持ちます。ただし例外として、自動記憶域期間継続するオブジェクトであ り、 volatile 型ではなく、かつ setjmp() 呼び出しと longjmp() 呼び出しとの 間で変更されるものについて、その値が不定になることは除きます。 setjmp()/longjmp() のペアはシグナルマスクを保存し復元しますが、 _setjmp()/_longjmp() のペアはレジスタセットとスタックしか保存および復元し ません ( sigprocmask(2) を参照 ) 。 sigsetjmp()/siglongjmp() 関数のペアは、引数 savemask が 0 でない場合、シ グナルマスクを保存および復元します。 0 である場合は、レジスタセットとス タックのみが保存されます。 |
エラー
env の内容が破壊されている場合、または既に復帰した環境に対応している場 合、 longjmp() ルーチンは、 longjmperror(3) を呼び出します。 longjmperror() から復帰すると、プログラムは中止します ( abort(3) を参照 ) 。 longjmperror() のデフォルトバージョンでは ‘‘longjmp botch’’ メッセージ を標準エラー出力に印字して復帰します。ユーザプログラムがもっと行儀よく脱 出することを望むなら、独自バージョンの longjmperror() を書くべきです。 |
関連項目
規格
setjmp() 関数と longjmp() 関数は ISO/IEC 9899:1990 (‘‘ISO C89’’) に適合し ています。 sigsetjmp() 関数と siglongjmp() 関数は IEEE Std 1003.1-1988 (‘‘POSIX.1’’) に適合しています。 FreeBSD 10.0 June 4, 1993 FreeBSD 10.0 |