SETJMP(3)

名称
sigsetjmp, siglongjmp, setjmp, longjmp, _setjmp, _longjmp, longjmperror - 非局所分岐

ライブラリ
libc

書式
<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() を書くべきです。

関連項目
sigaction(2), sigaltstack(2), signal(3)

規格
setjmp() 関数と longjmp() 関数は isoC に適合しています。 sigsetjmp() 関数と siglongjmp() 関数は p1003.1-88 に適合しています。