.\" 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$ .Dd June 4, 1993 .Dt SETJMP 3 .Os BSD 4 .Sh 名称 .Nm sigsetjmp , .Nm siglongjmp , .Nm setjmp , .Nm longjmp , .Nm _setjmp , .Nm _longjmp , .Nm longjmperror .Nd 非局所分岐 .Sh 書式 .Fd #include .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 の場合、シグナルマスクを保存および復元します。 それ以外の場合は、レジスタセットとスタックのみが保存されます。 .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 -ansiC に準拠しています。 .Fn sigsetjmp 関数と .Fn siglongjmp 関数は .St -p1003.1-88 に準拠しています。