Understanding Unix/Linux Programming-用户程序:play_again2

 1 /* play_again1.c
 2  * purpuse: ask if user wants another play 
 3  * better : instant response without echo
 4  * returns: 0 -> yes , 1 -> no 
 5  */
 6  
 7  #include <stdio.h>
 8  #include <stdlib.h>
 9  #include <termios.h>
10  
11  #define QUESTION "Do you want another play?"
12  
13  int get_response(char *);
14  void set_cr_noecho_mode(void);
15  void tty_mode(int); 
16  
17  int main()
18  {
19      int response ;
20      tty_mode(0);   // save tty mode
21      set_cr_noecho_mode();
22      response = get_response(QUESTION);
23      tty_mode(1);   // restore tty mode
24      return response ;
25  }
26  
27  int get_response(char * qiz)
28  {
29      int input ;
30      printf("%s(y/n)" , qiz);
31      while(1)
32      {
33          switch(input = getchar())
34          {
35              case 'y':
36              case 'Y': 
37                 printf("
");
38                 return 0 ;
39              case 'n': 
40              case 'N': 
41              case EOF: 
42                 printf("
");
43                 return 1 ;
44              default : 
45                 printf("
Cannot understand %c" , input );
46                 printf("Please type y or no 
");        
47          }
48      }
49  }
50  
51 void set_cr_noecho_mode(void)
52 {
53     struct  termios ttystate ;
54     tcgetattr(0 , &ttystate);
55     ttystate.c_lflag &= ~ICANON ;   // No Buffering
56     ttystate.c_lflag &= ~ECHO ;//关闭回显
57     ttystate.c_cc[VMIN] = 1 ;   //Get one char one time 
58     tcsetattr( 0 , TCSANOW , &ttystate);    
59 }
60 
61 void tty_mode(int mode)
62 {
63     static struct termios original_mode ;// 设置静态结构体变量
64     if(mode == 0 )
65     {
66         tcgetattr( 0 , & original_mode);// 存储原有设置
67     }
68     else
69     {
70         //还原原有设置
71         if( tcsetattr(0 , TCSANOW , & original_mode) == -1 )
72         {
73             perror("Restore tty settings failed!
");
74         }
75     }
76 }
原文地址:https://www.cnblogs.com/NJdonghao/p/5291941.html