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); } }