Usage: isetjmp:
integer*4 env(12) common /jmpblk/ env j = isetjmp( env )
Usage: longjmp:
integer*4 env(12) common /jmpblk/ env call longjmp(env,ival)
64 ビット環境でコンパイルする場合、これらのルーチンで使用される 12 個の要素配列 env が INTEGER*8 と宣言されている必要があります。
isetjmp と longjmp ルーチンは、プログラムの低レベルルーチンで発生するエラーや割り込みに対処する際に使用されます。これらのルーチンを使用するには経験が必要であり、移植性もないため、最後の手段としてのみ使用するようにしてください。バグやその他の詳細については、setjmp(3C) のマニュアルページを参照してください。
isetjmp は、env にスタック環境を保存します。レジスタ環境も保存されます。
longjmp は、isetjmp を最後に呼び出した際に保存された環境を復元し、その環境に戻り、isetjmp を呼び出すことで値 ival が返されたかのように実行を継続します。
isetjmp から返される整数式 ival は、longjmp が呼び出されない場合はゼロ、longjmp が呼び出される場合はゼロ以外の値となります。
例: isetjmp と longjmp を使用しているコードの一部:
integer*4 env(12) common /jmpblk/ env j = isetjmp( env ) ! <-- isetjmp if ( j .eq. 0 ) then call sbrtnA else call error_processor end if end subroutine sbrtnA integer*4 env(12) common /jmpblk/ env call longjmp( env, ival ) ! <-- longjmp return end
longjmp() を呼び出す前に、isetjmp を起動する必要があります。
isetjmp の引数は、12 個の整数の配列にする必要があります。
isetjmp を呼び出すルーチンから longjmp を呼び出すルーチンに、env 変数を共通ブロック経由で、または引数として渡す必要があります。
longjmp() は、スタックを消去しようとします。
longjmp() は、isetjmp() よりも低い呼び出しレベルから呼び出す必要があります。
isetjmp を手続き名である引数として渡しても機能しません。
setjmp(3C) を参照してください。
libC.a
setjmp(3C)