Here’s a simple example that demonstrates the usage of setjmp and longjmp in C:
#include <stdio.h>
#include <setjmp.h>
static jmp_buf env;
void foo(void);
int main()
{
if (setjmp(env) == 0)
{
printf("Calling foo...\n");
foo();
printf("Returned from foo.\n");
}
else
{
printf("Jumped back to main!\n");
}
return 0;
}
void foo(void)
{
printf("Inside foo. Jumping back to main...\n");
longjmp(env, 1);
}
In this program, we use setjmp
to save the current state at the beginning of main
, and then call a function foo
. Inside foo
, we print a message and then call longjmp
to jump back to the saved state in main
.
When we run this program, it produces the following output:
Calling foo...
Inside foo. Jumping back to main...
Jumped back to main!
As you can see, when we call longjmp
from inside foo
, it causes the program execution to “jump” back to where we called setjmp
in main
. This allows us to implement non-local control flow within our program.