home *** CD-ROM | disk | FTP | other *** search
- #include <signal.h>
- #include <stdlib.h>
-
- int _abterm=0;
-
- static void sigill(int)
- {
- }
- static void sigint(int)
- {
- }
- static void sigfpe(int)
- {
- }
- static void sigterm(int)
- {
- exit(EXIT_SUCCESS);
- }
- static void siguser1()
- {
- }
- static void siguser2()
- {
- }
- static void siguser3()
- {
- }
- static void siguser()
- {
- }
- static void sigbreak(int)
- {
- exit(EXIT_FAILURE);
- }
- static void sigabort(int)
- {
- _abterm = 1;
- exit(EXIT_FAILURE);
- }
- static void (*deftab[NSIG])(int) = {
- -1, -1, sigint, -1,
- sigill, -1, -1, -1,
- sigfpe, -1, -1, -1,
- -1, -1, -1,sigterm,
- siguser1,siguser2, -1, -1,
- siguser3,sigbreak,sigabort
- };
-
- static void (*sigtab[NSIG])(int);
- #pragma startup siginit 128
-
- static void siginit(void)
- {
- int i;
- for (i=0; i < NSIG; i++)
- sigtab[i] = deftab[i];
- }
- void (*signal(int signum, void (*func)()))(int)
- {
- void (*temp)(int);
- if (signum >= NSIG)
- return SIG_ERR;
- temp = sigtab[signum];
- if (temp == SIG_ERR)
- return SIG_ERR;
- if (temp == SIG_DFL)
- sigtab[signum] = deftab[signum];
- else
- sigtab[signum] = func;
- return temp;
- }
- int raise(int sig)
- {
- void (*temp)(int a) = sigtab[sig];
- if (temp == SIG_ERR)
- return 1;
- if (temp == SIG_IGN)
- return 0;
- (*temp)(sig);
- return 0;
- }