home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Professional / OS2PRO194.ISO / os2 / prgramer / unix / emx / test / sig2.c < prev    next >
Encoding:
C/C++ Source or Header  |  1993-01-02  |  2.2 KB  |  110 lines

  1. /* sig2.c (emx+gcc) */
  2.  
  3. #include <stdio.h>
  4. #include <stdlib.h>
  5. #include <signal.h>
  6. #include <setjmp.h>
  7. #include <process.h>
  8.  
  9. #define FALSE 0
  10. #define TRUE  1
  11.  
  12. typedef char boolean;
  13.  
  14. static boolean exit_flag = FALSE;
  15. static boolean recursion_flag = FALSE;
  16. static boolean jump_flag = FALSE;
  17. static boolean key_flag = FALSE;
  18. static boolean kill_flag = FALSE;
  19. static boolean quit_flag = FALSE;
  20. static char level = 'A' - 1;
  21. static jmp_buf jump;
  22.  
  23. static void handler (int sig)
  24. {
  25.   int i;
  26.  
  27.   if (exit_flag)
  28.     exit (0);
  29.   if (kill_flag)
  30.     {
  31.       putchar ('k');
  32.       signal (sig, SIG_DFL);
  33.       signal (sig, SIG_ACK);
  34.       kill (getpid (), sig);
  35.     }
  36.   if (jump_flag)
  37.     longjmp (jump, 1);
  38.   if (quit_flag)
  39.     {
  40.       if (raise (SIGQUIT) != 0)
  41.         perror ("\nraise (SIGQUIT)");
  42.     }
  43.   signal (sig, SIG_ACK);
  44.   putchar ('\a');
  45.   if (recursion_flag)
  46.     {
  47.       ++level;
  48.       for (i = 0; i < 2000; ++i)
  49.         putchar (level);
  50.       putchar ('\n');
  51.       --level;
  52.     }
  53. }
  54.  
  55. int main (int argc, char *argv[])
  56. {
  57.   int i;
  58.  
  59.   if (setjmp (jump) != 0)
  60.     {
  61.       puts ("jumped");
  62.       return (0);
  63.     }
  64.   for (i = 1; i < argc; ++i)
  65.     if (strcmp (argv[i], "-e") == 0)
  66.       exit_flag = TRUE;
  67.     else if (strcmp (argv[i], "-i") == 0)
  68.       kill_flag = TRUE;
  69.     else if (strcmp (argv[i], "-j") == 0)
  70.       jump_flag = TRUE;
  71.     else if (strcmp (argv[i], "-k") == 0)
  72.       key_flag = TRUE;
  73.     else if (strcmp (argv[i], "-q") == 0)
  74.       quit_flag = TRUE;
  75.     else if (strcmp (argv[i], "-r") == 0)
  76.       recursion_flag = TRUE;
  77.     else
  78.       {
  79.         puts ("Usage: sig2 [-e] [-i] [-j] [-k] [-q] [-r]");
  80.         return (1);
  81.       }
  82.   if (signal (SIGINT, handler) == SIG_ERR)
  83.     {
  84.       puts ("signal failed");
  85.       return (1);
  86.     }
  87.   if (key_flag)
  88.     {
  89.       int c;
  90.       
  91.       for (;;)
  92.         {
  93.           c = _read_kbd (0, 1, 0);
  94.           if (c == 0)
  95.             _read_kbd (0, 1, 0);
  96.           else if (c == 0x1b)
  97.             break;
  98.           else
  99.             putchar (c);
  100.         }
  101.     }
  102.   else
  103.     {
  104.       for (i = 0; i < 10000; ++i)
  105.         putchar ('.');
  106.     }
  107.   putchar ('\n');
  108.   return (0);
  109. }
  110.