Combining setjmp()/longjmp() and signal handling, we will be able to catch a signal and then jump to some other places for further or special processing rather than going back to the interrupted statement.
Here is a simple example. Click here to download a copy of this program.
#include <stdio.h>
#include <signal.h>
#include <setjmp.h>
jmp_buf JumpBuffer;
void INThandler(int);
void main(void)
{
signal(SIGINT, INThandler);
while (1) {
if (setjmp(JumpBuffer) == 0) {
printf("Hit Ctrl-C at anytime ... \n");
pause();
}
}
}
void INThandler(int sig)
{
char c;
signal(sig, SIG_IGN);
printf("OUCH, did you hit Ctrl-C?\n"
"Do you really want to quit? [y/n] ");
c = getchar();
if (c == 'y' || c == 'Y')
exit(0);
else {
signal(SIGINT, INThandler);
longjmp(JumpBuffer, 1);
}
}