home *** CD-ROM | disk | FTP | other *** search
/ Power Programming / powerprogramming1994.iso / progtool / editor / j414src.arc / KBD.C < prev    next >
C/C++ Source or Header  |  1989-10-10  |  1KB  |  69 lines

  1. #include "jove.h"
  2. #include <signal.h>
  3. #include <errno.h>
  4.  
  5.  
  6. #ifdef BSD_SIGS
  7. # define pause()    sigpause(0L)
  8. #endif
  9.  
  10. struct header {
  11.     int    pid,
  12.         nbytes;
  13.     char    buf[10];
  14. };
  15.  
  16. #define HEADER_SIZE    (2 * sizeof (int))
  17.  
  18. /* JOVE sends SIGQUIT whenever it wants the kbd process (this program)
  19.    to stop competing for input from the keyboard.  JOVE does this when
  20.    JOVE realizes that there are no more interactive processes running.
  21.    The reason we go through all this trouble is that JOVE slows down
  22.    a lot when it's getting its keyboard input via a pipe. */
  23.  
  24. static SIGRESULT strt_read proto((int));
  25.  
  26. static SIGRESULT
  27. hold_read(junk)
  28. int    junk;    /* passed in when invoked by a signal; of no interest */
  29. {
  30.     signal(SIGQUIT, strt_read);
  31.     pause();
  32.     SIGRETURN;
  33. }
  34.  
  35. static SIGRESULT
  36. strt_read(junk)
  37. int    junk;
  38. {
  39.     signal(SIGQUIT, hold_read);
  40.     SIGRETURN;
  41. }
  42.  
  43. int
  44. main(argc, argv)
  45. int    argc;
  46. char    **argv;
  47. {
  48.     struct header    header;
  49.     int    pid,
  50.         n;
  51.  
  52.     signal(SIGINT, SIG_IGN);
  53.     pid = getpid();
  54.     header.pid = pid;
  55.  
  56.     hold_read(0);
  57.     for (;;) {
  58.         n = read(0, header.buf, sizeof (header.buf));
  59.         if (n == -1) {
  60.             if (errno != EINTR)
  61.                 break;
  62.             continue;
  63.         }
  64.         header.nbytes = n;
  65.         write(1, (UnivPtr) &header, HEADER_SIZE + n);
  66.     }
  67.     return 0;
  68. }
  69.