第七讲 为用户编程:终端控制及.ppt

  1. 1、本文档共74页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第七讲 为用户编程:终端控制和信号 主要内容 软件工具与用户程序 读取和修改终端驱动程序的设置 非阻塞输入 用户输入的超时 信号 fcntl及signal系统调用 与终端有关的程序 用户常用的程序例如vi、emacs及许多游戏程序经常要有终端进行交互 它们设置终端驱动程序的击键和输出处理方式 用户经常用到的几种用户终端设置: 立即响应击键事件 有限的输入集 输入的超时 屏蔽Ctrl-C 终端驱动程序的模式 /*rotate.c*/ #include stdio.h #include ctype.h int main() { int c; while ( (c=getchar())!=EOF){ if (c==‘z’) c=‘a’ else if (islower(c)) c++; putchar(c); } 规范模式:缓冲和编辑 使用默认设置运行该程序(-退格键) $ gcc rotate.c -o rotate $./rotate abx- cd bcde efg ^C $ 输入的内容及程序所得到的内容 标准输入处理的特征 程序未得到输入的x,因为删除了它 击键的同时字符显示在屏幕上,但直到按了回车,程序才接收到输入 ^C键结束输入并终止程序 程序rotate并不负责这些事情,对于输入的缓冲、回显、编辑和控制键处理都由驱动程序完成 标准输入处理的这些特征被启动时,将终端连接称为规范模式 非规范处理 $stty -icanon;./rotate abbcxy^?cdde effggh $stty icanon stty -icanon命令关闭驱动程序中的规范模式处理 非规范模式没有缓冲,输入字母’a’,驱动程序跳过缓冲层,字符直接送到程序,然后程序显示字符’b’ 用户输入未缓冲可能会带来麻烦,如果用户想修改输入时,此时将无法修改 终端模式小结--规范模式 是用户常见的模式 输入的字符保存在缓冲区 接收到回车键时才将其中内容发送到程序 缓冲功能使驱动程序可实现编辑功能,例如删除字符、单词或者行 可通过命令stty或者系统调用tcsetattr修改执行上述操作的特定键 终端模式小结--非规范模式 缓冲和编辑功能被关闭时,连接被称为处于非规范模式 设备驱动器仍然进行特定字符的处理,例如Ctrl-C及换行符及回车符之间的转换 删除单词、字符及终止编辑键将不具有特殊 含义而是被视作常规的数据输入 终端模式小结--raw模式 每个处理步骤都被一个独立的位控制,例如ISIG位控制Ctrl-C是否用于终止一个程序 程序可随意关闭所有这些处理步骤 当所有处理都被关闭后,驱动程序将输入直接传递给程序。这种模式就称为raw模式 stty raw命令 编写一个用户程序:play_again.c play_again.c的逻辑: 对用户显示提示问题 接受输入 如果是y返回0 如果是n返回1 第一个play_again0.c程序 play_again0.c的不足 必须先按 回车,程序才能接受到数据 当用户按回车键时,程序接收整行的数据对其进行处理,例如 Do you want another transaction(y/n)? sure thing 改进方法 首先关闭规范输入,使得程序能够在用户敲键的同时得到输入的字符 set_crmode() { struct termios ttystate; tcgetattr( 0, ttystate); /* read curr. setting */ ttystate.c_lflag = ~ICANON; /* no buffering */ ttystate.c_cc[VMIN] = 1; /* get 1 char at a time */ tcsetattr( 0 , TCSANOW, ttystate); /* install settings */} tty_mode(int how) static struct termios original_mode; if ( how == 0 ) tcgetattr(0, original_mode); else return tcsetattr(0, TCSANOW, original_mode); 程序的主要过程 首先调用tty_mode(0)函数保存当前终端的设置信息 set_crmode()函数首先将终端置于一个字符接一个字符的模式 然后调用函数显示一个提示符,并获得一个响应 最后调用tty_mode(1)函数还原终端的设置 将终端置入字符输入模式包括两部分工作: 将ICANON位关闭 将控制字符数组中的VMIN下标元素置一,VMIN的

文档评论(0)

kehan123 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档