Understanding Unix/Linux Programming-用户程序:play_again1
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_crmode(void); 15 void tty_mode(int); 16 17 int main() 18 { 19 int response ; 20 tty_mode(0); // save tty mode 21 set_crmode(); 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("\n"); 38 return 0 ; 39 case 'n': 40 case 'N': 41 case EOF: 42 printf("\n"); 43 return 1 ; 44 default : 45 printf("\nCannot understand %c" , input ); 46 printf("Please type y or no \n"); 47 } 48 } 49 } 50 51 void set_crmode(void) 52 { 53 struct termios ttystate ; 54 tcgetattr(0 , &ttystate); 55 ttystate.c_lflag &= ~ICANON ; // No Buffering 56 ttystate.c_cc[VMIN] = 1 ; //Get one char one time 57 tcsetattr( 0 , TCSANOW , &ttystate); 58 } 59 60 void tty_mode(int mode) 61 { 62 static struct termios original_mode ;// 设置静态结构体变量 63 if(mode == 0 ) 64 { 65 tcgetattr( 0 , & original_mode);// 存储原有设置 66 } 67 else 68 { 69 //还原原有设置 70 if( tcsetattr(0 , TCSANOW , & original_mode) == -1 ) 71 { 72 perror("Restore tty settings failed!\n"); 73 } 74 } 75 }