Linux下無需按下回車(無阻塞)讀取輸入鍵值


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

  1、如果用戶沒有輸入,則程序會阻塞等待用戶輸入輸入內容后,且需要用戶點回車鍵才能完成讀取鍵盤輸入。

  2、用戶輸入的信息,會在屏幕上顯示出來。 

 

一、以下代碼實現了:

  1、用戶沒有輸入,則在設定時間過后,程序會繼續運行下去

  2、用戶輸入信息不會在屏幕上顯示出來

  3、程序能夠不等待回車,直接響應鍵盤輸入

  4、用到了system函數,會啟動子進程(缺點)。

  5、此種方法是使用stty命令,設置終端輸入為禁止回顯並忽略回車符來實現的。

 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);     //Prohibit echoing,ignoring carriage returns
38 
39     usleep(100);
40     input_char = get_char();
41 
42     system(STTY_DEF TTY_PATH);    //Turn on echo and don't ignore carriage return
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 }    
nonblocking.c

二、另外一種方法,相對於第一種方法,改進點主要有:

  1、使用tcgetattr函數和tcsetattr函數代替system函數,減少子進程啟動數量。

  2、此種實現是通過termios來實現的,termios的實現中,有大量的參數設置,還有偽終端的說法。

代碼如下:

 1 #include <stdio.h>
 2 #include <fcntl.h>
 3 #include <termios.h>
 4 #include <unistd.h>
 5 
 6 #define UNUSED_PARAMTER(X)    (void)(X)
 7 
 8 char nonblocking_input(void)
 9 {
10     char input_ch;
11     struct termios newt, oldt;
12     
13     int tty = open("/dev/tty", O_RDONLY);    //Open control terminal
14     
15     tcgetattr(tty, &oldt);            //Get terminal properties
16     newt = oldt;
17     
18     //Set characters are not buffered(~ICANON) and do not echo(~ECHO).
19     //You can also choose only one of them.
20     newt.c_lflag &= ~( ICANON | ECHO );
21     tcsetattr(tty, TCSANOW, &newt);
22     
23     read(tty, &input_ch, 1);
24     tcsetattr(tty, TCSANOW, &oldt);        //Restore terminal properties
25 
26     return input_ch;
27 }
28 
29 int main(int argc, char **argv)
30 {
31     UNUSED_PARAMTER(argc);
32     UNUSED_PARAMTER(argv);
33 
34     char input_char;
35 
36     input_char = nonblocking_input();
37 
38     printf("\n\tYour input is %c!\n", input_char);
39     printf("\nApplication finish.\n\n");
40     
41     return 0;
42 }  
nonblocking_inout.c

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM