home *** CD-ROM | disk | FTP | other *** search
/ NetNews Usenet Archive 1992 #18 / NN_1992_18.iso / spool / comp / sys / hp / 9333 < prev    next >
Encoding:
Internet Message Format  |  1992-08-16  |  3.4 KB

  1. From: rjl@hpuerca.atl.hp.com (Rich Lombardi)
  2. Date: Sun, 16 Aug 1992 17:22:06 GMT
  3. Subject: Re: How to do nobuffered IO on stdin in C on HP unix?
  4. Message-ID: <151270001@hpuerca.atl.hp.com>
  5. Organization: the HP Response Center, Atlanta
  6. Path: sparky!uunet!wupost!sdd.hp.com!hpscdc!hplextra!hpcc05!hpuerca!rjl
  7. Newsgroups: comp.sys.hp
  8. References: <1992Aug14.121655.18711@walter.cray.com>
  9. Lines: 96
  10.  
  11. / hpuerca:comp.sys.hp / albrcp@cray.com (Albrecht Craig P) /  1:16 pm  Aug 14, 1992 /
  12. >Does anybody know a way of doing nobuffered IO using C on a HP9000/7xx
  13. >workstation?
  14. >
  15. >I would like to do nobuffered IO on the "stdin" file.  I want to be
  16. >able to process each character as the user types it in at the time
  17. >of input, NOT when they press the RETURN key.
  18. >
  19. >I heard that one can use "setvbuf", but I have no such luck in getting
  20. >to work for "stdin"
  21.  
  22. Here's an old example that I've used for some time.  There should be no problem
  23. compiling and running this on any HP-UX system.
  24.  
  25. Note that this doesn't use C's FILE types but file descriptors instead.  It
  26. operates on the STDIN file descriptor 0.
  27.  
  28. I haven't played with setvbuf(3S) or tcattribute(3C) yet which explains why
  29. this still uses termio(7) ioctl's.
  30.  
  31. Rich Lombardi
  32. rjl@hpuerca.atl.hp.com
  33.  
  34. ---------------------------------cut here----------------------------------
  35.  
  36. /* Program:  raw_rs232.c
  37.  *
  38.  * Purpose:  To read a single character at a time from stdin.
  39.  *
  40.  * rjl 2/20/87
  41.  */
  42.  
  43. /*
  44. ###############################################################
  45. Hewlett-Packard makes no warranty of any kind with regard to the
  46. accuracy or completeness of any information in this file, including,
  47. but not limited to, the implied warranties of merchantability and
  48. fitness for a particular purpose.  Hewlett-Packard shall not be held
  49. liable for errors contained herein or direct, indirect, special,
  50. incidental or consequential damages in connection with the furnishing,
  51. performance, or use of this material.
  52. ###############################################################
  53. */
  54.  
  55. #include <sys/ioctl.h>
  56. #include <sys/termio.h>
  57. #include <stdio.h>
  58. main()
  59. {
  60.     struct termio orig, new;
  61.     char buf[25];
  62.  
  63.     /* Get structure for stdin.  First one is to restore back to original
  64.        state, second one is to modify the driver.  */
  65.     if(ioctl(0,TCGETA,&orig)<0)  {
  66.         perror("ioctl TCGETA");
  67.         exit(1);
  68.     }
  69.     if(ioctl(0,TCGETA,&new)<0)  {
  70.         perror("ioctl TCGETA");
  71.         exit(1);
  72.     }
  73.  
  74.     /* change the termio structure */
  75.     new.c_lflag &= ~ICANON;        /* turn off canonical processing */
  76.     new.c_lflag &= ~ECHO;        /* turn off echo */
  77.     new.c_iflag &= ~IXON;        /* turn off start/stop output cntrl */
  78.     new.c_iflag &= ~IXOFF;        /* turn off start/stop input cntrl */
  79.     new.c_iflag &= ~IXANY;        /* disable any character to restart */
  80.     new.c_cc[VMIN] = 1;         /* so we can read 1 char at a time */
  81.  
  82.     /* activate the new structure */
  83.     if(ioctl(0,TCSETA,&new)<0)  {
  84.         perror("ioctl TCSETA");
  85.         exit(1);
  86.     }
  87.  
  88.     /* Read a character at a time until the letter 'q' is typed */
  89.     while (1) {
  90.         fprintf(stderr,"\nEnter a character ");
  91.         read(0,buf,1);
  92.         if(*buf == 'q') break;
  93.  
  94.         /* check to see if we received a DC1 or DC3 */
  95.         /* Can be generated at the keyboard with <CNTRL>S and 
  96.            <CNTRL>q                         */
  97.         else if(*buf == '\021') printf("DC1\n");
  98.         else if(*buf == '\023') printf("DC3\n");
  99.         else printf("\n character is %c\n",*buf);
  100.     }
  101.     /* restore the termio driver back to the original state we found it */
  102.     if(ioctl(0,TCSETA,&orig)<0)  {
  103.         perror("ioctl TCSETA");
  104.         exit(1);
  105.     }
  106. }
  107.