home *** CD-ROM | disk | FTP | other *** search
/ CD Shareware Magazine 1996 December / CD_shareware_12-96.iso / DOS / Programa / CCDL122.ZIP / CLIBS / PROCONT / SIGNAL.C < prev    next >
Encoding:
C/C++ Source or Header  |  1996-07-22  |  1.2 KB  |  81 lines

  1. #include <signal.h>
  2. #include <stdlib.h>
  3.  
  4. int _abterm=0;
  5.  
  6. static void sigill(int)
  7. {
  8. }
  9. static void sigint(int)
  10. {
  11. }
  12. static void sigfpe(int)
  13. {
  14. }
  15. static void sigterm(int)
  16. {
  17.     exit(EXIT_SUCCESS);
  18. }
  19. static void siguser1()
  20. {
  21. }
  22. static void siguser2()
  23. {
  24. }
  25. static void siguser3()
  26. {
  27. }
  28. static void siguser()
  29. {
  30. }
  31. static void sigbreak(int)
  32. {
  33.     exit(EXIT_FAILURE);
  34. }
  35. static void sigabort(int)
  36. {
  37.     _abterm = 1;
  38.     exit(EXIT_FAILURE);
  39. }
  40. static void (*deftab[NSIG])(int) = {
  41.      -1,  -1,    sigint,     -1,
  42.     sigill,  -1, -1, -1,
  43.     sigfpe,  -1, -1, -1,
  44.      -1, -1, -1,sigterm,
  45.     siguser1,siguser2, -1, -1,
  46.     siguser3,sigbreak,sigabort 
  47. };
  48.  
  49. static void (*sigtab[NSIG])(int);
  50. #pragma startup siginit 128
  51.  
  52. static void siginit(void)
  53. {
  54.     int i;
  55.     for (i=0; i < NSIG; i++)
  56.         sigtab[i] = deftab[i];
  57. }
  58. void (*signal(int signum, void (*func)()))(int)
  59. {
  60.     void (*temp)(int);
  61.     if (signum >= NSIG)
  62.         return SIG_ERR;
  63.     temp = sigtab[signum];
  64.     if (temp == SIG_ERR)
  65.         return SIG_ERR;
  66.     if (temp == SIG_DFL) 
  67.         sigtab[signum] = deftab[signum];
  68.     else
  69.         sigtab[signum] = func;
  70.     return temp;
  71. }
  72. int raise(int sig)
  73. {
  74.     void (*temp)(int a) = sigtab[sig];
  75.     if (temp == SIG_ERR)
  76.         return 1;
  77.     if (temp == SIG_IGN)
  78.         return 0;
  79.     (*temp)(sig);
  80.     return 0;
  81. }