tail head cat sleep
QR code linking to this page

manページ  — SETJMP

名称

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() 関数呼び出しによって保存された環境を復元します。 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 C90") に適合しています。 sigsetjmp() 関数と siglongjmp() 関数は IEEE Std 1003.1-88 ("POSIX.1") に適合しています。

SETJMP (3) June 4, 1993

tail head cat sleep
QR code linking to this page


このマニュアルページサービスについてのご意見は Ben Bullock にお知らせください。 Privacy policy.

Today, the Unix equivalent of a power drill would have 20 dials and switches, come with a nonstandard plug, require the user to hand-wind the motor coil, and not accept 3/8" or 7/8" drill bits (though this would be documented in the BUGS section of its instruction manual).
— The Unix Haters' handbook