0007-signal.c (3261B)
1 #include <assert.h> 2 #include <setjmp.h> 3 #include <signal.h> 4 #include <stdio.h> 5 6 sig_atomic_t abrt, fpe, iint, segv, term, def; 7 jmp_buf recover; 8 9 /* 10 output: 11 test 1 12 test 2 13 test 3 14 test 4 15 end: 16 */ 17 18 void 19 handler1(int sig) 20 { 21 switch (sig) { 22 case SIGABRT: 23 abrt = 1; 24 break; 25 case SIGFPE: 26 fpe = 1; 27 break; 28 case SIGINT: 29 iint = 1; 30 break; 31 case SIGSEGV: 32 segv = 1; 33 break; 34 case SIGTERM: 35 term = 1; 36 break; 37 default: 38 def = 1; 39 break; 40 } 41 } 42 43 void 44 handler2(int sig) 45 { 46 switch (sig) { 47 case SIGABRT: 48 abrt = 1; 49 break; 50 case SIGFPE: 51 fpe = 1; 52 break; 53 case SIGINT: 54 iint = 1; 55 break; 56 case SIGSEGV: 57 segv = 1; 58 break; 59 case SIGTERM: 60 term = 1; 61 break; 62 default: 63 def = 1; 64 break; 65 } 66 longjmp(recover, 1); 67 } 68 69 void 70 test1() 71 { 72 void (*shdl)(int); 73 74 puts("test 1"); 75 assert(signal(SIGABRT, handler1) == SIG_DFL); 76 assert(signal(SIGFPE, handler1) == SIG_DFL); 77 78 shdl = signal(SIGINT, handler1); 79 assert(shdl == SIG_DFL || shdl == SIG_IGN); 80 assert(signal(SIGSEGV, handler1) == SIG_DFL); 81 assert(signal(SIGTERM, handler1) == SIG_DFL); 82 } 83 84 void 85 test2() 86 { 87 puts("test 2"); 88 term = abrt = fpe = iint = segv = 0; 89 assert(signal(SIGABRT, handler1) == handler1); 90 assert(signal(SIGFPE, handler1) == handler1); 91 assert(signal(SIGINT, handler1) == handler1); 92 assert(signal(SIGSEGV, handler1) == handler1); 93 assert(signal(SIGTERM, handler1) == handler1); 94 95 assert(raise(SIGABRT) != -1); 96 assert(raise(SIGFPE) != -1); 97 assert(raise(SIGINT) != -1); 98 assert(raise(SIGSEGV) != -1); 99 assert(raise(SIGTERM) != -1); 100 101 if (!abrt || !fpe || !iint || !segv || !term) 102 printf("a handled signal was missed: %d %d %d %d %d\n", 103 abrt, fpe, iint, segv, term); 104 if (def) 105 puts("a wrong signal was received"); 106 } 107 108 void 109 test3() 110 { 111 puts("test 3"); 112 def = abrt = term = fpe = iint = segv = 0; 113 assert(signal(SIGABRT, SIG_IGN) == handler1); 114 assert(signal(SIGFPE, SIG_IGN) == handler1); 115 assert(signal(SIGINT, SIG_IGN) == handler1); 116 assert(signal(SIGSEGV, SIG_IGN) == handler1); 117 assert(signal(SIGTERM, SIG_IGN) == handler1); 118 119 assert(raise(SIGABRT) != -1); 120 assert(raise(SIGFPE) != -1); 121 assert(raise(SIGINT) != -1); 122 assert(raise(SIGSEGV) != -1); 123 assert(raise(SIGTERM) != -1); 124 125 if (abrt || fpe || iint || segv || term) 126 printf("a handled signal was received: %d %d %d %d %d\n", 127 abrt, fpe, iint, segv, term); 128 if (def) 129 puts("a wrong signal was received"); 130 } 131 132 void 133 test4() 134 { 135 puts("test 4"); 136 def = abrt = term = fpe = iint = segv = 0; 137 assert(signal(SIGABRT, handler2) == SIG_IGN); 138 assert(signal(SIGFPE, handler2) == SIG_IGN); 139 assert(signal(SIGINT, handler2) == SIG_IGN); 140 assert(signal(SIGSEGV, handler2) == SIG_IGN); 141 assert(signal(SIGTERM, handler2) == SIG_IGN); 142 143 if (!setjmp(recover)) 144 assert(raise(SIGABRT) != -1); 145 if (!setjmp(recover)) 146 assert(raise(SIGFPE) != -1); 147 if (!setjmp(recover)) 148 assert(raise(SIGINT) != -1); 149 if (!setjmp(recover)) 150 assert(raise(SIGSEGV) != -1); 151 if (!setjmp(recover)) 152 assert(raise(SIGTERM) != -1); 153 154 if (!abrt || !fpe || !iint || !segv || !term) 155 printf("a handled signal was missed: %d %d %d %d %d\n", 156 abrt, fpe, iint, segv, term); 157 if (def) 158 puts("a wrong signal was received"); 159 } 160 161 int 162 main() 163 { 164 assert(SIG_ERR != SIG_IGN && SIG_ERR != SIG_DFL); 165 166 test1(); 167 test2(); 168 test3(); 169 test4(); 170 171 return 0; 172 }