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

本文介绍了一个简单的C语言程序,用于在游戏中询问玩家是否希望重新开始游戏。通过禁用标准输入缓冲并即时响应用户的输入,实现了无回显的交互效果。程序详细展示了如何配置终端属性以达到即时响应的效果,并提供了完整的源代码。
 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 }

 

arm-buildroot-linux-gnueabi-gcc: WARNING: unsafe header/library path used in cross-compilation: '-I/usr/local/include' ../lib/tevent/tevent_req.c: In function '_tevent_req_create': ../lib/tevent/tevent_req.c:78:8: warning: implicit declaration of function 'talloc_pooled_object' [-Wimplicit-function-declaration] 78 | req = talloc_pooled_object( | ^~~~~~~~~~~~~~~~~~~~ ../lib/tevent/tevent_req.c:79:12: error: expected expression before 'struct' 79 | mem_ctx, struct tevent_req, 2, | ^~~~~~ The following command failed: arm-buildroot-linux-gnueabi-gcc -I../lib/zlib -DMAX_DEBUG_LEVEL=-1 -D__location__=\ -ffunction-sections -fdata-sections -I. -I/data/red-round3/red-round3/Iplatform/openwrt/build_dir/target-arm-openwrt-linux-uclibc-be220v1/samba-3.6.25/source3 -I/data/red-round3/red-round3/Iplatform/openwrt/build_dir/target-arm-openwrt-linux-uclibc-be220v1/samba-3.6.25/source3/../lib/popt -I/data/red-round3/red-round3/Iplatform/openwrt/build_dir/target-arm-openwrt-linux-uclibc-be220v1/samba-3.6.25/source3/../lib/iniparser/src -Iinclude -I./include -I. -I. -I./../lib/replace -I./librpc -I./.. -I./../lib/talloc -I./../lib/tevent -I../lib/tdb/include -DHAVE_CONFIG_H -I/data/red-round3/red-round3/Iplatform/openwrt/staging_dir/target-arm-openwrt-linux-uclibc-be220v1/usr/include -I/data/red-round3/red-round3/Iplatform/openwrt/staging_dir/target-arm-openwrt-linux-uclibc-be220v1/include -I/data/red-round3/red-round3/Iplatform/openwrt/staging_dir/usr-be220v1/include -I/data/red-round3/red-round3/Iplatform/openwrt/../../bcm504L04/toolchain/opt/toolchains/crosstools-arm_softfp-gcc-10.3-linux-4.19-glibc-2.32-binutils-2.36.1/usr/include -Iinclude -I./include -I. -I. -I./../lib/replace -I./librpc -I./.. -I./../lib/popt -I/usr/local/include -I/data/red-round3/red-round3/Iplatform/openwrt/build_dir/target-arm-openwrt-linux-uclibc-be220v1/samba-3.6.25/source3/lib -I.. -D_SAMBA_BUILD_=3 -D_SAMBA_BUILD_=3 -c ../lib/tevent/tevent_req.c -o ../lib/tevent/tevent_req.o Makefile:1675: recipe for target '../lib/tevent/tevent_req.o' failed make[4]: *** [../lib/tevent/tevent_req.o] Error 1 make[4]: Leaving directory '/data/red-round3/red-round3/Iplatform/openwrt/build_dir/target-arm-openwrt-linux-uclibc-be220v1/samba-3.6.25/source3' Makefile:224: recipe for target '/data/red-round3/red-round3/Iplatform/openwrt/build_dir/target-arm-openwrt-linux-uclibc-be220v1/samba-3.6.25/.built' failed make[3]: *** [/data/red-round3/red-round3/Iplatform/openwrt/build_dir/target-arm-openwrt-linux-uclibc-be220v1/samba-3.6.25/.built] Error 2 make[3]: Leaving directory '/data/red-round3/red-round3/Iplatform/packages/opensource/samba' package/Makefile:133: recipe for target 'package/feeds/iplatform/samba/compile' failed make[2]: *** [package/feeds/iplatform/samba/compile] Error 2 make[2]: Leaving directory '/data/red-round3/red-round3/Iplatform/openwrt' /data/red-round3/red-round3/Iplatform/openwrt/include/toplevel.mk:184: recipe for target 'package/samba/compile' failed make[1]: *** [package/samba/compile] Error 2 make[1]: Leaving directory '/data/red-round3/red-round3/Iplatform/openwrt' Makefile:234: recipe for target 'iplatform_package/samba/compile' failed make: *** [iplatform_package/samba/compile] Error 2
最新发布
11-02
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值