SETJMP(3)

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

書式
#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 の場合、シグナルマスクを保存および復元します。 それ以外の場合は、レジスタセットとスタックのみが保存されます。

エラー
env の内容が破壊されている場合、または既に復帰した環境に対応している場合、 longjmp() ルーチンは、ルーチン longjmperror(3) を呼び出します。 longjmperror() が返った場合、プログラムはアボートされます ( abort(3) を参照 ) 。 longjmperror() のデフォルトバージョンは “longjmp botch” メッセージを標準エラー出力に表示して復帰します。 ユーザプログラムがより優雅に脱出することを望むなら、 独自バージョンの longjmperror() を書くべきです。

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

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