1 #include <signal.h> 2 #include <unistd.h> 3 #include <stdlib.h> 4 5 void foo (void); 6 void bar (void); 7 8 void subroutine (int); 9 void handler (int); 10 void have_a_very_merry_interrupt (void); 11 main()12main () 13 { 14 puts ("Starting up"); 15 16 foo (); /* Put a breakpoint on foo() and call it to see a dummy frame */ 17 18 19 have_a_very_merry_interrupt (); 20 21 puts ("Shutting down"); 22 } 23 24 void foo(void)25foo (void) 26 { 27 puts ("hi in foo"); 28 } 29 30 void bar(void)31bar (void) 32 { 33 char *nuller = 0; 34 35 puts ("hi in bar"); 36 37 *nuller = 'a'; /* try to cause a segfault */ 38 } 39 40 void handler(int sig)41handler (int sig) 42 { 43 subroutine (sig); 44 } 45 46 /* The first statement in subroutine () is a place for a breakpoint. 47 Without it, the breakpoint is put on the while comparison and will 48 be hit at each iteration. */ 49 50 void subroutine(int in)51subroutine (int in) 52 { 53 int count = in; 54 while (count < 100) 55 count++; 56 } 57 58 void have_a_very_merry_interrupt(void)59have_a_very_merry_interrupt (void) 60 { 61 puts ("Waiting to get a signal"); 62 signal (SIGALRM, handler); 63 alarm (1); 64 sleep (2); /* We'll receive that signal while sleeping */ 65 } 66 67