嵌入式linux:getchar() 非阻塞

2019-07-12 20:11发布

#由于getchar()函数会一直阻塞,网上搜到下面的函数来实现非阻塞的读取。实际使用的时候只需要调用kbhit()函数即可。其他函数没有看是什么意思     #include #include #include #include #include #include #include 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_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; /* Watch stdin (fd 0) to see when it has input. */ FD_ZERO(&rfds); FD_SET(0, &rfds); /* Wait up to five seconds. */ tv.tv_sec = 0; tv.tv_usec = 0; retval = select(1, &rfds, NULL, NULL, &tv); /* Don't rely on the value of tv now! */ if (retval == -1) { perror("select()"); return 0; } else if (retval) return 1; /* FD_ISSET(0, &rfds) will be true. */ 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 ", key); if(key == 'q') break; } else { fprintf(stderr, " "); } } if(tty_set_flag == 0) tty_reset(); return 0; }