参考网址
 (138条消息) 嵌入式linux:getchar() 非阻塞_起点的博客-CSDN博客_getchar 非阻塞 
程序
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 
 | #include <stdio.h>
 #include <string.h>
 #include <sys/time.h>
 #include <sys/types.h>
 #include <unistd.h>
 #include <termios.h>
 #include <unistd.h>
 
 static struct termios ori_attr, cur_attr;
 
 static __inline int tty_reset(void)
 {
 if (tcsetattr(STDIN_FILENO, TCSANOW, &ori_attr) != 0)
 return -1;
 
 return 0;
 }
 
 static __inline int tty_set(void)
 {
 
 if (tcgetattr(STDIN_FILENO, &ori_attr))
 return -1;
 
 memcpy(&cur_attr, &ori_attr, sizeof(cur_attr));
 cur_attr.c_lflag &= ~ICANON;
 
 cur_attr.c_lflag &= ~ECHO;
 cur_attr.c_cc[VMIN] = 1;
 cur_attr.c_cc[VTIME] = 0;
 
 if (tcsetattr(STDIN_FILENO, TCSANOW, &cur_attr) != 0)
 return -1;
 
 return 0;
 }
 
 static __inline int kbhit(void)
 {
 
 fd_set rfds;
 struct timeval tv;
 int retval;
 
 
 FD_ZERO(&rfds);
 FD_SET(0, &rfds);
 
 tv.tv_sec = 0;
 tv.tv_usec = 0;
 
 retval = select(1, &rfds, NULL, NULL, &tv);
 
 
 if (retval == -1)
 {
 perror("select()");
 return 0;
 }
 else if (retval)
 return 1;
 
 else
 return 0;
 return 0;
 }
 
 int main()
 {
 int tty_set_flag;
 tty_set_flag = tty_set();
 while (1)
 {
 
 if (kbhit())
 {
 const int key = getchar();
 printf("%c pressed\n", key);
 if (key == 'q')
 break;
 }
 else
 {
 fprintf(stderr, "<no key detected>\n");
 }
 }
 
 if (tty_set_flag == 0)
 tty_reset();
 return 0;
 }
 
 | 
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 
 | #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(1)
 {
 if(kbhit())
 {
 printf("keyboard hit\n");
 printf("%c\n", getchar());
 }
 else
 {
 printf("keyboard not hit\n");
 }
 }
 
 return 0;
 }
 
 |