欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  科技

Linux下无需按下回车(无阻塞)读取输入键值

程序员文章站 2022-04-23 19:48:59
linux常用输入函数scanf和fgets通常都是阻塞式的: 1、如果用户没有输入,则程序会阻塞等待用户输入输入内容后,且需要用户点回车键才能完成读取键盘输入。 2、用户输入的信息,会在屏幕上显示出来。 以下代码实现了: 1、用户没有输入,则在设定时间过后,程序会继续运行下去 2、用户输入信息不会 ......

linux常用输入函数scanf和fgets通常都是阻塞式的:

  1、如果用户没有输入,则程序会阻塞等待用户输入输入内容后,且需要用户点回车键才能完成读取键盘输入。

  2、用户输入的信息,会在屏幕上显示出来。 

 

以下代码实现了:

  1、用户没有输入,则在设定时间过后,程序会继续运行下去

  2、用户输入信息不会在屏幕上显示出来

  3、程序能够不等待回车,直接响应键盘输入

 

Linux下无需按下回车(无阻塞)读取输入键值
 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 }
test.c