home *** CD-ROM | disk | FTP | other *** search
/ Fresh Fish 9 / FreshFishVol9-CD2.bin / bbs / gnu / libnix-0.8-src.lha / libnix-0.8 / sources / nix / signal / raise.c < prev    next >
Encoding:
C/C++ Source or Header  |  1994-12-12  |  742 b   |  39 lines

  1. #include <signal.h>
  2. #include <stdio.h>
  3.  
  4. extern void (*__signalfunc[])(int);
  5. extern int __signalmask,__signalpending;
  6.  
  7. int raise(int sig)
  8. {
  9.   int ret=-1;
  10.  
  11.   if (!(sig<1||sig>6))
  12.   {
  13.     int *mask=&__signalmask,*pending=&__signalpending;
  14.  
  15.     *pending|=1<<(sig-1);
  16.     while(!(*mask&(1<<(sig-1)))&&
  17.           (*pending&(1<<(sig-1))))
  18.     {
  19.       *pending&=~(1<<(sig-1));
  20.       if(__signalfunc[sig-1]!=SIG_IGN)
  21.       {
  22.         int oldmask=*mask;
  23.         *mask|=1<<(sig-1);
  24.         if(__signalfunc[sig-1]==SIG_DFL)
  25.         {
  26.           if(sig==SIGINT)
  27.           {
  28.             fputs("***Break\n",stderr); exit(20);
  29.           }
  30.         }else
  31.           (*__signalfunc[sig-1])(sig);
  32.         *mask=oldmask;
  33.       }
  34.     }
  35.     ret=0;
  36.   }
  37.   return ret;
  38. }
  39.