SETJMP(3) | FreeBSD Library Functions Manual | SETJMP(3) |
名称
sigsetjmp, siglongjmp, setjmp, longjmp, _setjmp, _longjmp, longjmperror — 非局所ジャンプ (分岐)ライブラリ
Standard C Library (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() 関数呼び出しによって保存された環境を復元します。この関数から戻ると、対応する setjmp() 呼び出しが、0 ではなく val で指定された値を返したかのようにプログラムの実行が継続します。
呼び出しのペアはお互いに混在できます。すなわち、 sigsetjmp() と siglongjmp() および setjmp() と longjmp() の組み合わせは、同じプログラム内で使用できます。しかし、個々の呼び出しは混合することはできません。たとえば、 setjmp() に渡される env 引数は siglongjmp() に渡すことはできません。
longjmp() ルーチンは、 setjmp() ルーチンから復帰した後では呼び出すことはできません。
volatile 型ではなく、かつ setjmp() 呼び出しと longjmp() 呼び出しとの間で変更された自動記憶域期間のオブジェクトの値を除いて、アクセス可能なオブジェクトはすべて longjmp() ルーチンが呼び出された時点での値を持ちます。
setjmp()/ longjmp() のペアはシグナルマスクを保存し復元しますが、 _setjmp()/ _longjmp() のペアはレジスタセットとスタックしか保存および復元しません ( sigprocmask( 2) を参照)。
sigsetjmp()/ siglongjmp() 関数のペアは、引数 savemask が 0 でない場合、シグナルマスクを保存および復元します。その他の場合は、レジスタセットとスタックのみが保存されます。
エラー
env の内容が破壊されている場合、または既に復帰した環境に該当している場合、 longjmp() ルーチンは、 longjmperror( 3) を呼び出します。 longjmperror() から戻ると、プログラムは中断します ( abort(3) を参照)。 longjmperror() のデフォルトバージョンでは“longjmp botch
”メッセージを標準エラー出力に印字して戻ります。ユーザプログラムがもっと行儀よく終了することを望むなら、独自バージョンの
longjmperror() を書くべきです。
規格
setjmp() と longjmp() 関数は、 ISO/IEC 9899:1990 (“ISO C90”) に適合しています。 sigsetjmp() と siglongjmp() 関数は、 IEEE Std 1003.1-1988 (“POSIX.1”) に適合しています。June 4, 1993 | FreeBSD |