Linux下无需按下回车(无阻塞)读取输入键值
程序员文章站
2022-04-23 19:48:59
linux常用输入函数scanf和fgets通常都是阻塞式的: 1、如果用户没有输入,则程序会阻塞等待用户输入输入内容后,且需要用户点回车键才能完成读取键盘输入。 2、用户输入的信息,会在屏幕上显示出来。 以下代码实现了: 1、用户没有输入,则在设定时间过后,程序会继续运行下去 2、用户输入信息不会 ......
linux常用输入函数scanf和fgets通常都是阻塞式的:
1、如果用户没有输入,则程序会阻塞等待用户输入输入内容后,且需要用户点回车键才能完成读取键盘输入。
2、用户输入的信息,会在屏幕上显示出来。
以下代码实现了:
1、用户没有输入,则在设定时间过后,程序会继续运行下去
2、用户输入信息不会在屏幕上显示出来
3、程序能够不等待回车,直接响应键盘输入
1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <unistd.h> 4 5 #define TTY_PATH "/dev/tty" 6 #define STTY_US "stty raw -echo -F " 7 #define STTY_DEF "stty -raw echo -F " 8 9 #define UNUSED_PARAMTER(X) (void)(X) 10 11 static char get_char( void ) 12 { 13 fd_set rfds; 14 struct timeval tv; 15 char input_char = 0; 16 17 FD_ZERO(&rfds); 18 FD_SET(0, &rfds); 19 20 /** 21 * Set wait time 22 */ 23 //tv.tv_sec = 0; //seconds 24 //tv.tv_usec = 500; //microseconds 25 26 /*Check for keyboard input.*/ 27 if (select(1, &rfds, NULL, NULL, &tv) > 0) 28 input_char = getchar(); 29 30 return input_char; 31 } 32 33 char nonblocking_input( void ) 34 { 35 char input_char; 36 37 system(STTY_US TTY_PATH); 38 39 usleep(100); 40 input_char = get_char(); 41 42 system(STTY_DEF TTY_PATH); 43 44 return input_char; 45 } 46 47 int main(int argc, char **argv) 48 { 49 UNUSED_PARAMTER(argc); 50 UNUSED_PARAMTER(argv); 51 52 char input_char; 53 54 input_char = nonblocking_input(); 55 56 printf("\n\tYour input is %c!\n", input_char); 57 printf("\nApplication finish.\n\n"); 58 59 return 0; 60 }