1#include <assert.h>2#include <setjmp.h>3#include <signal.h>4#include <stdio.h>56sig_atomic_t abrt, fpe, iint, segv, term, def;7jmp_buf recover;89/*10output:11test 112test 213test 314test 415end:16*/1718void19handler1(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}4243void44handler2(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}6869void70test1()71{72 void (*shdl)(int);7374 puts("test 1");75 assert(signal(SIGABRT, handler1) == SIG_DFL);76 assert(signal(SIGFPE, handler1) == SIG_DFL);7778 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}8384void85test2()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);9495 assert(raise(SIGABRT) != -1);96 assert(raise(SIGFPE) != -1);97 assert(raise(SIGINT) != -1);98 assert(raise(SIGSEGV) != -1);99 assert(raise(SIGTERM) != -1);100101 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}107108void109test3()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);118119 assert(raise(SIGABRT) != -1);120 assert(raise(SIGFPE) != -1);121 assert(raise(SIGINT) != -1);122 assert(raise(SIGSEGV) != -1);123 assert(raise(SIGTERM) != -1);124125 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}131132void133test4()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);142143 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);153154 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}160161int162main()163{164 assert(SIG_ERR != SIG_IGN && SIG_ERR != SIG_DFL);165166 test1();167 test2();168 test3();169 test4();170171 return 0;172}