一个无聊的自动提款机程序---最终版——进行信号的处理
2011-11-29 23:51
302 查看
/* * 自动提款机程序,他会问用户很多的yes/no的问题 * * atm.sh * * while true * do * do_a_transaction # run a program * if play_again # run our program * then * continue # if "y" loop back * fi * break # if "n" break * done * * 这个银行脚本程序将程序的各个组件组合起来 * 1.第一个称为do_a_transaction的程序,完成ATM的工作 * 2.第二个组件play_again,从用户得到回答 * * */ /* * PLAY_AGAIN.C * 功能:实现组件2 * * 对用户显示提示问题 * 接受输入 * 如果是y,返回0 * 如果是n,返回1 * */ #include <stdio.h> #include <termios.h> #include <string.h> #include <fcntl.h> #include <signal.h> #include <stdlib.h> #define ASK "Do you want another transaction" /* 最大尝试次数*/ #define TRIES 7 /*每次尝试的时间*/ #define SLEEPTIME 1 /*警告用户*/ #define BEEP putchar('\a') int get_response(char *,int); int set_crmode(); int set_nodely(); int get_ok_char(); int tty_mode(int); void ctrl_c_handler(int); /* * 这个版本的play_again改进的问题包括 * 关闭规范输入,使得程序能够在用户敲击键盘的同时得到输入的字符 * * 改进包括 忽略非法键 * * 设置超时特征 * * 关闭信号ctrl-c,并设置信号处理函数 * 关闭crtl+/ * */ int main(){ int response; void ctrl_c_handler(int); //保存tty的mode tty_mode(0); //设置tty的mode set_crmode(); //关闭阻塞 set_nodelay(); //为信号SIGINT设置信号处理函数 signal(SIGINT,ctrl_c_handler); //为信号quit进行禁止 signal(SIGQUIT,SIG_IGN); //获得回答 response = get_response(ASK,TRIES); printf("\nresponse = %d\n",response); //恢复tty的mode tty_mode(1); return response; } int get_response(char *question,int maxtries){ printf("%s(y/n)?",question); int input; fflush(stdout); while(1){ sleep(SLEEPTIME); input = getchar(); if((input == 'y')||(input == 'Y')) return 0; if((input == 'n')||(input == 'N')) return 1; if(maxtries-- == 0) return 2; BEEP; } //循环读取用户的输入,指导用户输入ynYN /* switch(input=getchar()){ case 'y': case 'Y':return 0; case 'n': case 'N': case EOF:return 1; // default: //printf("\ncan not understand %c,",input); //printf("Please type y or n \n"); * * 当输入sure,没有显示任何内容,他会忽略错误信息 * * */ } get_ok_char(){ int c; while((c=getchar())!=EOF&&strchr("yYnN",c)==NULL); return c; } set_nodelay(){ int termflags; termflags = fcntl(0,F_GETFL); termflags |= O_NDELAY; fcntl(0,F_SETFL,termflags); } set_crmode(){ struct termios ttystate; //读取当前的终端驱动属性 tcgetattr(0,&ttystate); //修改配置 //关闭缓冲 ttystate.c_lflag &= ~ICANON; //关闭回显 ttystate.c_lflag &= ~ECHO; //保证一次仅获得一个字符 ttystate.c_cc[VMIN] == 1; //保存修改 tcsetattr(0,TCSANOW,&ttystate); } tty_mode(int how){ static struct termios original_mode; static int original_flags; static int stored = 0; if(how == 0){ tcgetattr(0,&original_mode); original_flags = fcntl(0,F_GETFL); stored = 1; }else{ tcsetattr(0,TCSANOW,&original_mode); fcntl(0,F_SETFL,original_flags); } } void ctrl_c_handler(int sigmun){ tty_mode(1); printf("\n"); exit(1); }
相关文章推荐
- 一个无聊的自动提款机程序
- 一个无聊的自动提款机程序---改进版--修改终端属性
- 一个无聊的自动提款机程序---改进版--忽略非法输入
- 一个无聊的自动提款机程序---改进版——限制用户,超时特征
- 因为不想再程序中写循环,因此把UI页面需要更新的纪录的主键组成了一个以","隔开的字符串,将这个字符串传入存储过程中进行处理(转)
- 编写程序接收一个ASCII码(从0至128),然后显示输入ASCII码所代表的字符。 注意: (1)能够对1个或多个输入的ASCII码进行处理; (2)对于输入的非ASCII码进行判定和排除。
- 0805编写一个程序,实现同一个信号处理函数对多个信号的处理
- Android是一个针对触摸屏专门设计的操作系统,当点击编辑框,系统自动为用户弹出软键盘,以便用户进行输入。 那么,弹出软键盘后必然会造成原有布局高度的减少,那么系统应该如何来处理布局的减少
- 编写一个程序,要求用户输入最多10个高尔夫成绩,并将其存储在一个数组中。 程序允许用户提早结束输入,并在一行上显示所有成绩,然后报告平均成绩。 请使用3个数组处理函数来分别进行输入、显示和计算
- 高级教程- 用C++写一个信号处理的程序
- 调用信号处理程序被捕捉的信号自动地加到进程的当前信号屏蔽字中signal() sigpending()
- http_build_query()就是将一个数组转换成url 问号?后面的参数字符串,并且会自动进行urlencode处理,及它的逆向函数
- 面试题,编写一个程序,将a.txt文件中的单词与b.txt文件中的单词交替合并到c.txt文件中,a.txt文件中的单词用回车符分隔,b.txt文件中用回车或空格进行分隔。
- 可以自动的写个小程序对其进行分页 (转)
- 开源:给每个文档计算一个指纹,然后用指纹进行相似度的计算 含源码和可执行程序
- SAP BW ODS无效字符自动处理程序【升级版】
- apue第三版 在信号处理程序中调用不可再入函数 的例子遇到的问题
- C#写的照片上传代码--建立一个一般处理程序
- 用程序来控制一个网页,实现自动输入等操作
- 一个实用的从文本文件读取数据进行排序的程序