Home
       0007-signal.c - scc - simple c99 compiler
  HTML git clone git://git.simple-cc.org/scc
   DIR Log
   DIR Files
   DIR Refs
   DIR Submodules
   DIR README
   DIR LICENSE
       ---
       0007-signal.c (3206B)
       ---
            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         puts("test 1");
           73         assert(signal(SIGABRT, handler1) == SIG_DFL);
           74         assert(signal(SIGFPE, handler1) == SIG_DFL);
           75         assert(signal(SIGINT, handler1) == SIG_DFL);
           76         assert(signal(SIGSEGV, handler1) == SIG_DFL);
           77         assert(signal(SIGTERM, handler1) == SIG_DFL);
           78 }
           79 
           80 void
           81 test2()
           82 {
           83         puts("test 2");
           84         term = abrt = fpe = iint = segv = 0;
           85         assert(signal(SIGABRT, handler1) == handler1);
           86         assert(signal(SIGFPE, handler1) == handler1);
           87         assert(signal(SIGINT, handler1) == handler1);
           88         assert(signal(SIGSEGV, handler1) == handler1);
           89         assert(signal(SIGTERM, handler1) == handler1);
           90 
           91         assert(raise(SIGABRT) != -1);
           92         assert(raise(SIGFPE) != -1);
           93         assert(raise(SIGINT) != -1);
           94         assert(raise(SIGSEGV) != -1);
           95         assert(raise(SIGTERM) != -1);
           96 
           97         if (!abrt || !fpe || !iint || !segv || !term)
           98                 printf("a handled signal was missed: %d %d %d %d %d\n",
           99                        abrt, fpe, iint, segv, term);
          100         if (def)
          101                 puts("a wrong signal was received");
          102 }
          103 
          104 void
          105 test3()
          106 {
          107         puts("test 3");
          108         def = abrt = term = fpe = iint = segv = 0;
          109         assert(signal(SIGABRT, SIG_IGN) == handler1);
          110         assert(signal(SIGFPE, SIG_IGN) == handler1);
          111         assert(signal(SIGINT, SIG_IGN) == handler1);
          112         assert(signal(SIGSEGV, SIG_IGN) == handler1);
          113         assert(signal(SIGTERM, SIG_IGN) == handler1);
          114 
          115         assert(raise(SIGABRT) != -1);
          116         assert(raise(SIGFPE) != -1);
          117         assert(raise(SIGINT) != -1);
          118         assert(raise(SIGSEGV) != -1);
          119         assert(raise(SIGTERM) != -1);
          120 
          121         if (abrt || fpe || iint || segv || term)
          122                 printf("a handled signal was received: %d %d %d %d %d\n",
          123                        abrt, fpe, iint, segv, term);
          124         if (def)
          125                 puts("a wrong signal was received");
          126 }
          127 
          128 void
          129 test4()
          130 {
          131         puts("test 4");
          132         def = abrt = term = fpe = iint = segv = 0;
          133         assert(signal(SIGABRT, handler2) == SIG_IGN);
          134         assert(signal(SIGFPE, handler2) == SIG_IGN);
          135         assert(signal(SIGINT, handler2) == SIG_IGN);
          136         assert(signal(SIGSEGV, handler2) == SIG_IGN);
          137         assert(signal(SIGTERM, handler2) == SIG_IGN);
          138 
          139         if (!setjmp(recover))
          140                 assert(raise(SIGABRT) != -1);
          141         if (!setjmp(recover))
          142                 assert(raise(SIGFPE) != -1);
          143         if (!setjmp(recover))
          144                 assert(raise(SIGINT) != -1);
          145         if (!setjmp(recover))
          146                 assert(raise(SIGSEGV) != -1);
          147         if (!setjmp(recover))
          148                 assert(raise(SIGTERM) != -1);
          149 
          150         if (!abrt || !fpe || !iint || !segv || !term)
          151                 printf("a handled signal was missed: %d %d %d %d %d\n",
          152                        abrt, fpe, iint, segv, term);
          153         if (def)
          154                 puts("a wrong signal was received");
          155 }
          156 
          157 int
          158 main()
          159 {
          160         assert(SIG_ERR != SIG_IGN && SIG_ERR != SIG_DFL);
          161 
          162         test1();
          163         test2();
          164         test3();
          165         test4();
          166 
          167         return 0;
          168 }