スポンサーリンク

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

関連項目

sigaction(2), sigaltstack(2), signal(3)

規格

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

スポンサーリンク