scc

simple c99 compiler
git clone git://git.simple-cc.org/scc
Log | Files | Refs | README | LICENSE

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 }