|
一,用select
- #include <stdio.h>
- #include <termios.h>
- #include <unistd.h>
- #include <sys/types.h>
- #include <sys/time.h>
- void changemode(int);
- int kbhit(void);
- int main(void)
- {
- int ch;
- changemode(1);
- while ( !kbhit() )
- {
- putchar('.');
- }
- ch = getchar();
- printf("\nGot %c\n", ch);
- changemode(0);
- return 0;
- }
- void changemode(int dir)
- {
- static struct termios oldt, newt;
- if ( dir == 1 )
- {
- tcgetattr( STDIN_FILENO, &oldt);
- newt = oldt;
- newt.c_lflag &= ~( ICANON | ECHO );
- tcsetattr( STDIN_FILENO, TCSANOW, &newt);
- }
- else
- tcsetattr( STDIN_FILENO, TCSANOW, &oldt);
- }
- int kbhit (void)
- {
- struct timeval tv;
- fd_set rdfs;
- tv.tv_sec = 0;
- tv.tv_usec = 0;
- FD_ZERO(&rdfs);
- FD_SET (STDIN_FILENO, &rdfs);
- select(STDIN_FILENO+1, &rdfs, NULL, NULL, &tv);
- return FD_ISSET(STDIN_FILENO, &rdfs);
- }
复制代码
二,用非阻塞io
- #include <stdio.h>
- #include <termios.h>
- #include <unistd.h>
- #include <fcntl.h>
- int kbhit(void)
- {
- struct termios oldt, newt;
- int ch;
- int oldf;
- tcgetattr(STDIN_FILENO, &oldt);
- newt = oldt;
- newt.c_lflag &= ~(ICANON | ECHO);
- tcsetattr(STDIN_FILENO, TCSANOW, &newt);
- oldf = fcntl(STDIN_FILENO, F_GETFL, 0);
- fcntl(STDIN_FILENO, F_SETFL, oldf | O_NONBLOCK);
- ch = getchar();
- tcsetattr(STDIN_FILENO, TCSANOW, &oldt);
- fcntl(STDIN_FILENO, F_SETFL, oldf);
- if(ch != EOF)
- {
- ungetc(ch, stdin);
- return 1;
- }
- return 0;
- }
- int main(void)
- {
- while(!kbhit())
- puts("Press a key!");
- printf("You pressed '%c'!/n", getchar());
- return 0;
- }
复制代码 |
|