This program demonstrates a C programming entering an infinite loop
and then breaking out of that loop using signal handlers and longjmp.
/* *Test the procedure to catch a memory exception */ #include <sys wait.h> #include <errno.h> #include <fcntl.h> #include <ctype.h> #include <stdio.h> #include <signal.h> #include <setjmp.h> #include <unistd.h> sigjmp_buf env; /* * Handle the SIGALRM signal when a system alarm expires. */ void handle_sigalarm() { siglongjmp(env, 1); } /* * */ int infinite_loop (){ while(5); } /* * Check the given memory allocation * Trap any segmentation faults * Return 1 if would have crashed * Return 0 if good. */ int call_infinite_loop (){ volatile int x; x = sigsetjmp(env,1); alarm(5); if (x == 0) infinite_loop(); alarm(0); } /* * Initialize the signal handlers for memory faults */ void InitializeSignalHandlers(){ struct sigaction handle; handle.sa_flags = 0; handle.sa_handler = handle_sigalarm; sigaction(SIGALRM, &handle, NULL); } /* * Initialize everything and run the tests. */ int main (){ InitializeSignalHandlers(); call_infinite_loop(); return 0; }
No comments:
Post a Comment