The man page for tty in section 4 of the manual discusses how to change the terminal settings to do things like put the terminal in character-by-character mode so that you can read each character as it is typed. To view this man page, type:
man 4 ttyBelow is an example of how to use the functions described in that man page. It is a function called keypressed, which turns on character-by-character mode, then uses another special function call (the FIONREAD ioctl call) to ask the system how many characters are waiting to be read, then turns off character-by-character mode (or, actually, puts it back to whatever it was before the function started); the net result is a determination of whether or not a key has been pressed. Note that this function would not work if it did not turn on character-by-character mode, because FIONREAD would continue to return 0 until the user hit return.
/* Procedure to check for waiting input on the tty. * Does not actually read the input. */ #include <sys/types.h> #include <sys/time.h> #include <sys/ioctl.h> #include <stdio.h> int keypressed() { /* These are for ioctl */ struct sgttyb tty, ntty; int ttyset, stat, arg; ttyset = 0; /* * The TIOCGETP ioctl call gets the tty information * structure. See tty(4) for details about the contents * of that structure. */ stat = ioctl(0, TIOCGETP, &tty); if (stat == -1) { perror("ioctl"); return(-1); } /* * CBREAK is the status flag that controls character * by character input mode. This if statement checks * to see if CBREAK is already enabled and only enables * it if it is not. */ if (! (tty.sg_flags & CBREAK)) { ntty = tty; ttyset = (! ttyset); /* OR'ing the status bits with CBREAK turns it on. */ ntty.sg_flags |= CBREAK; /* TIOCSETN changes the terminal characteristics, * without discarding pending data. */ stat = ioctl(0, TIOCSETN, &ntty); if (stat == -1) { perror("ioctl"); return(-1); } } /* FIONREAD returns the number of characters of waiting * input */ stat = ioctl(0, FIONREAD, &arg); if (stat == -1) { perror("ioctl"); return(-1); } if (ttyset) { /* put the tty characteristics back to their * original form */ stat = ioctl(0, TIOCSETN, &tty); if (stat == -1) { perror("ioctl"); return(-1); } } return(arg); }last updated: 6/12/95