setjmp関数は現在の関数の実行環境を退避します。その後longjmp関数を呼び出すことにより、setjmp関数を呼び出したプログラム上の位置に戻ることができます。
以下にsetjmp、longjmp関数を使用して関数間の制御の移動をサポートした例を示します。
1 #include <stdio.h>
2 #include <setjmp.h>
3 jmp_buf env;
4 void sub();
5 void main()
6 {
7
8 if (setjmp(env)!=0){
9 printf("return from longjmp\n");
10 exit(0);
11 }
12 sub();
13 }
14
15 void sub()
16 {
17 printf("subroutine is running \n");
18 longjmp(env,1);
19 }
8行目でsetjmp関数を呼んでいます。この時、setjmp関数の呼び出された環境を、jmp_buf型の変数envに退避します。この時のリターン値は0なので、次に関数subが呼び出されます。
関数subの中で呼び出されるlongjmp関数により、変数envに退避した環境を回復します。その結果、プログラムは、あたかも8行目のsetjmp関数からリターンしたかのようにふるまいます。ただし、この時のリターン値はlongjmp関数の第2実引数で指定した値(1)になります。