.\" Copyright (c) 1990, 1991, 1993 .\" The Regents of the University of California. All rights reserved. .\" .\" This code is derived from software contributed to Berkeley by .\" the American National Standards Committee X3, on Information .\" Processing Systems. .\" .\" Redistribution and use in source and binary forms, with or without .\" modification, are permitted provided that the following conditions .\" are met: .\" 1. Redistributions of source code must retain the above copyright .\" notice, this list of conditions and the following disclaimer. .\" 2. Redistributions in binary form must reproduce the above copyright .\" notice, this list of conditions and the following disclaimer in the .\" documentation and/or other materials provided with the distribution. .\" 3. All advertising materials mentioning features or use of this software .\" must display the following acknowledgement: .\" This product includes software developed by the University of .\" California, Berkeley and its contributors. .\" 4. Neither the name of the University nor the names of its contributors .\" may be used to endorse or promote products derived from this software .\" without specific prior written permission. .\" .\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND .\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE .\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE .\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE .\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL .\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS .\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) .\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT .\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY .\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF .\" SUCH DAMAGE. .\" .\" @(#)setjmp.3 8.1 (Berkeley) 6/4/93 .\" %FreeBSD: src/lib/libc/gen/setjmp.3,v 1.5.2.4 2001/12/14 18:33:51 ru Exp % .\" WORD: automatic storage invocation duration 自動記憶域期間 [JIS C] .\" WORD: gracefully 行儀よく [doc-jp] .\" .\" $FreeBSD$ .Dd June 4, 1993 .Dt SETJMP 3 .Os .Sh 名称 .Nm sigsetjmp , .Nm siglongjmp , .Nm setjmp , .Nm longjmp , .Nm _setjmp , .Nm _longjmp , .Nm longjmperror .Nd 非局所分岐 .Sh ライブラリ .Lb libc .Sh 書式 .In setjmp.h .Ft int .Fn sigsetjmp "sigjmp_buf env" "int savemask" .Ft void .Fn siglongjmp "sigjmp_buf env" "int val" .Ft int .Fn setjmp "jmp_buf env" .Ft void .Fn longjmp "jmp_buf env" "int val" .Ft int .Fn _setjmp "jmp_buf env" .Ft void .Fn _longjmp "jmp_buf env" "int val" .Ft void .Fn longjmperror void .Sh 解説 .Fn sigsetjmp , .Fn setjmp および .Fn _setjmp 関数は、呼び出し元の環境を .Fa env に保存します。これらの関数はどれも 0 を返します。 .Pp 対応する .Fn longjmp 関数は、それぞれ最も新しい .Fn setjmp 関数呼び出しによって保存された環境を復元します。 .Fn longjmp 関数はその後で復帰するので、対応する .Fn setjmp 呼び出しが、0 ではなく .Fa val で指定された値を返したばかりであるかのように プログラムの実行が継続します。 .Pp 呼び出しのペアはお互いに混合できます。すなわち、 .Fn sigsetjmp と .Fn siglongjmp および .Fn setjmp と .Fn longjmp の各組み合わせは、同じプログラム内で使用できます。 しかし、個々の呼び出しは混合することはできません。 たとえば、 .Fn setjmp に渡される .Fa env 引数は .Fn siglongjmp に渡すことはできません。 .Pp .Fn longjmp ルーチンは、 .Fn setjmp を呼び出したルーチンから復帰した後では 呼び出すことはできません。 .Pp アクセス可能なオブジェクトはすべて .Fn longjmp ルーチンが呼び出された時点での値を持ちます。 ただし例外として、自動記憶域期間継続するオブジェクトであり、 .Em volatile 型ではなく、かつ .Fn setjmp 呼び出しと .Fn longjmp 呼び出しとの間で変更されるものについて、 その値が不定になることは除きます。 .Pp .Fn setjmp Ns / Ns Fn longjmp のペアはシグナルマスクを保存し復元しますが、 .Fn _setjmp Ns / Ns Fn _longjmp のペアはレジスタセットとスタックしか保存および復元しません ( .Fn sigprocmask 2 を参照 ) 。 .Pp .Fn sigsetjmp Ns / Ns Fn siglongjmp 関数のペアは、引数 .Fa savemask が 0 でない場合、シグナルマスクを保存および復元します。 0 である場合は、レジスタセットとスタックのみが保存されます。 .Sh エラー .Fa env の内容が破壊されている場合、または既に復帰した環境に対応している場合、 .Fn longjmp ルーチンは、 .Fn longjmperror 3 を呼び出します。 .Fn longjmperror から復帰すると、プログラムは中止します ( .Xr abort 3 を参照 ) 。 .Fn longjmperror のデフォルトバージョンでは .Dq Li longjmp botch メッセージを標準エラー出力に印字して復帰します。 ユーザプログラムがもっと行儀よく脱出することを望むなら、 独自バージョンの .Fn longjmperror を書くべきです。 .Sh 関連項目 .Xr sigaction 2 , .Xr sigaltstack 2 , .Xr signal 3 .Sh 規格 .Fn setjmp 関数と .Fn longjmp 関数は .St -isoC に適合しています。 .Fn sigsetjmp 関数と .Fn siglongjmp 関数は .St -p1003.1-88 に適合しています。