第七讲 为用户编程终端控制和优秀课件.ppt
《第七讲 为用户编程终端控制和优秀课件.ppt》由会员分享,可在线阅读,更多相关《第七讲 为用户编程终端控制和优秀课件.ppt(74页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、第七讲 为用户编程终端控制和第1页,本讲稿共74页主要内容软件工具与用户程序软件工具与用户程序读取和修改终端驱动程序的设置读取和修改终端驱动程序的设置非阻塞输入非阻塞输入用户输入的超时用户输入的超时信号信号fcntl及及signal系统调用系统调用第2页,本讲稿共74页与终端有关的程序用户常用的程序例如用户常用的程序例如vi、emacs及许多游及许多游戏程序经常要有终端进行交互戏程序经常要有终端进行交互它们设置终端驱动程序的击键和输出处它们设置终端驱动程序的击键和输出处理方式理方式用户经常用到的几种用户终端设置:用户经常用到的几种用户终端设置:立即响应击键事件立即响应击键事件有限的输入集有限的
2、输入集输入的超时输入的超时屏蔽屏蔽Ctrl-C第3页,本讲稿共74页终端驱动程序的模式/*rotate.c*/#include#include int main()int c;while(c=getchar()!=EOF)if(c=z)c=a else if(islower(c)c+;putchar(c);第4页,本讲稿共74页规范模式:缓冲和编辑使用默认设置运行该程序使用默认设置运行该程序(-退格键退格键)$gcc rotate.c-o rotate$./rotateabx-cdbcdeefg C$第5页,本讲稿共74页输入的内容及程序所得到的内容rotate程序终端驱动程序显示器及键盘第6
3、页,本讲稿共74页标准输入处理的特征程序未得到输入的程序未得到输入的x,因为删除了它,因为删除了它击键的同时字符显示在屏幕上,但直到击键的同时字符显示在屏幕上,但直到按了回车,程序才接收到输入按了回车,程序才接收到输入C键结束输入并终止程序键结束输入并终止程序程序程序rotate并不负责这些事情,对于输入并不负责这些事情,对于输入的缓冲、回显、编辑和控制键处理都由的缓冲、回显、编辑和控制键处理都由驱动程序完成驱动程序完成标准输入处理的这些特征被启动时,将标准输入处理的这些特征被启动时,将终端连接称为规范模式终端连接称为规范模式第7页,本讲稿共74页非规范处理$stty-icanon;./rot
4、ateabbcxy?cddeeffggh$stty icanonstty-icanon命令关闭驱动程序中的规范模式处理命令关闭驱动程序中的规范模式处理非规范模式没有缓冲,输入字母非规范模式没有缓冲,输入字母a,驱动程序跳,驱动程序跳过缓冲层,字符直接送到程序,然后程序显示字符过缓冲层,字符直接送到程序,然后程序显示字符b用户输入未缓冲可能会带来麻烦,如果用户想修改用户输入未缓冲可能会带来麻烦,如果用户想修改输入时,此时将无法修改输入时,此时将无法修改第8页,本讲稿共74页终端模式小结-规范模式是用户常见的模式是用户常见的模式输入的字符保存在缓冲区输入的字符保存在缓冲区接收到回车键时才将其中内容
5、发送到程接收到回车键时才将其中内容发送到程序序缓冲功能使驱动程序可实现编辑功能,缓冲功能使驱动程序可实现编辑功能,例如删除字符、单词或者行例如删除字符、单词或者行可通过命令可通过命令stty或者系统调用或者系统调用tcsetattr修修改执行上述操作的特定键改执行上述操作的特定键第9页,本讲稿共74页终端模式小结-非规范模式缓冲和编辑功能被关闭时,连接被称为缓冲和编辑功能被关闭时,连接被称为处于非规范模式处于非规范模式设备驱动器仍然进行特定字符的处理,设备驱动器仍然进行特定字符的处理,例如例如Ctrl-C及换行符及回车符之间的转换及换行符及回车符之间的转换删除单词、字符及终止编辑键将不具有删除
6、单词、字符及终止编辑键将不具有特殊特殊 含义而是被视作常规的数据输入含义而是被视作常规的数据输入第10页,本讲稿共74页终端模式小结-raw模式每个处理步骤都被一个独立的位控制,例如每个处理步骤都被一个独立的位控制,例如ISIG位控制位控制Ctrl-C是否用于终止一个程序是否用于终止一个程序程序可随意关闭所有这些处理步骤程序可随意关闭所有这些处理步骤当所有处理都被关闭后,驱动程序将输入直接传递给当所有处理都被关闭后,驱动程序将输入直接传递给程序。这种模式就称为程序。这种模式就称为raw模式模式stty raw命令命令第11页,本讲稿共74页编写一个用户程序:play_again.cplay_a
7、gain.c的逻辑:的逻辑:对用户显示提示问题对用户显示提示问题接受输入接受输入如果是如果是y返回返回0如果是如果是n返回返回1第一个第一个play_again0.c程序程序第12页,本讲稿共74页play_again0.c的不足必须先按必须先按 回车,程序才能接受到数据回车,程序才能接受到数据当用户按回车键时,程序接收整行的数当用户按回车键时,程序接收整行的数据对其进行处理,例如据对其进行处理,例如Do you want another transaction(y/n)?sure things u r e t h i n g 第13页,本讲稿共74页改进方法首先关闭规范输入,使得程序能够在用
8、户敲键的同时得到输入首先关闭规范输入,使得程序能够在用户敲键的同时得到输入的字符的字符set_crmode()struct termios ttystate;tcgetattr(0,&ttystate);/*read curr.setting*/ttystate.c_lflag&=ICANON;/*no buffering*/ttystate.c_ccVMIN =1;/*get 1 char at a time*/tcsetattr(0,TCSANOW,&ttystate);/*install settings*/第14页,本讲稿共74页tty_mode(int how)static stru
9、ct termios original_mode;if(how=0)tcgetattr(0,&original_mode);else return tcsetattr(0,TCSANOW,&original_mode);第15页,本讲稿共74页程序的主要过程首先调用首先调用tty_mode(0)函数保存当前终端函数保存当前终端的设置信息的设置信息set_crmode()函数首先将终端置于一个字函数首先将终端置于一个字符接一个字符的模式符接一个字符的模式然后调用函数显示一个提示符,并获得然后调用函数显示一个提示符,并获得一个响应一个响应最后调用最后调用tty_mode(1)函数还原终端的设函数还
10、原终端的设置置第16页,本讲稿共74页将终端置入字符输入模式包括两部分工将终端置入字符输入模式包括两部分工作:作:将将ICANON位关闭位关闭将控制字符数组中的将控制字符数组中的VMIN下标元素置一,下标元素置一,VMIN的值告诉驱动程序一次可以读取多的值告诉驱动程序一次可以读取多少个字符少个字符第17页,本讲稿共74页编译执行play_again1程序此时,程序可以直接接收和处理字符而此时,程序可以直接接收和处理字符而不用等待回车键不用等待回车键但对每个非法字符都提示错误信息,可但对每个非法字符都提示错误信息,可能比较烦能比较烦可关闭回显模式,丢掉不需要的字符,可关闭回显模式,丢掉不需要的字
11、符,直到得到可接收的字符为止直到得到可接收的字符为止在在set_crmode函数中加入语句函数中加入语句ttystate.c_lflag&=ECHO;第18页,本讲稿共74页阻塞与非阻塞输入当调用当调用getchar或者或者read等函数从文件描等函数从文件描述符读数据时,这些调用一直等待用户述符读数据时,这些调用一直等待用户的输入,如果用户不输入,则继续等待,的输入,如果用户不输入,则继续等待,这种行为就术语阻塞输入这种行为就术语阻塞输入阻塞不仅仅是终端连接的属性,而且是阻塞不仅仅是终端连接的属性,而且是任何一个打开文件的属性任何一个打开文件的属性可使用可使用fcntl或者或者open,通过
12、开启,通过开启O_NDELAY标志为文件描述符启动非阻标志为文件描述符启动非阻塞输入。塞输入。第19页,本讲稿共74页非阻塞读取文件关闭文件描述符的阻塞状态,然后从中关闭文件描述符的阻塞状态,然后从中read时,结果如何呢?时,结果如何呢?如果能够获得输入,如果能够获得输入,read返回输入数据返回输入数据及字符个数,如果没有输入字符,及字符个数,如果没有输入字符,read返回返回0,就像遇到文件末尾一样,有错误,就像遇到文件末尾一样,有错误,返回返回-1.每个文件都有一块保存未读取数据的地每个文件都有一块保存未读取数据的地方,若文件描述符置了方,若文件描述符置了O_NDELAY并且并且该空间
13、为空,则该空间为空,则read返回返回0。第20页,本讲稿共74页play_again3.cget_response()intinput;printf(%s(y/n)?,question);/*ask*/fflush(stdout);/*force output*/while(1)sleep(SLEEPTIME);/*wait a bit*/input=tolower(get_ok_char();/*get next chr*/if(input=y)return 0;if(input=n)return 1;if(maxtries-=0)/*outatime?*/return 2;/*sayso
14、*/BEEP;第21页,本讲稿共74页实验结果在输入后,程序会延时一会儿在输入后,程序会延时一会儿如果长时间不输入,程序也会退出如果长时间不输入,程序也会退出第22页,本讲稿共74页fflush(out)函数终端驱动对于输出也是一行行缓冲的终端驱动对于输出也是一行行缓冲的直到它收到一个换行符或者程序试图从直到它收到一个换行符或者程序试图从终端读取数据时才会进行输出终端读取数据时才会进行输出而此时而此时getchar被延迟读入,因此通过该被延迟读入,因此通过该函数将提示信息输出到屏幕上,否则用函数将提示信息输出到屏幕上,否则用户将看不到提示信息。户将看不到提示信息。第23页,本讲稿共74页Ctr
15、l-C执行上述程序时,如果输入执行上述程序时,如果输入Ctrl-C则程则程序终止运行,同时,也终止了整个登录序终止运行,同时,也终止了整个登录会话会话原因是什么呢?原因是什么呢?第24页,本讲稿共74页Ctrl-C设置O_NDELAY设置crmode显示提示符等待用户输入用户输入恢复tty设置恢复fcntl标志退出程序流程Ctrl C进程被终止进程正常退出时流向第25页,本讲稿共74页Ctrl-C程序接收到程序接收到Ctrl-C后,会立即退出,此时后,会立即退出,此时,无法执行重置启动程序的代码,无法执行重置启动程序的代码返回返回shell并从用户获得命令行时,终端并从用户获得命令行时,终端仍
16、处于非阻塞模式。仍处于非阻塞模式。shell调用调用read获取命令行,但是因为处获取命令行,但是因为处于非阻塞状态,于非阻塞状态,read立即返回立即返回0.这时这时shell程序就退出程序就退出原因总结:程序结束时,文件描述符处原因总结:程序结束时,文件描述符处于一个错误的状态。于一个错误的状态。第26页,本讲稿共74页信号Ctrl-C中断当前运行的程。这个中断由内核的信号机中断当前运行的程。这个中断由内核的信号机制产生制产生Ctrl-C的过程:的过程:用户输入用户输入Ctrl-C驱动程序收到字符驱动程序收到字符匹配匹配VINTR和和ISIG的字符被开启的字符被开启驱动程序调用信号系统驱动
17、程序调用信号系统信号系统发送信号系统发送SIGINT到进程到进程进程收到进程收到SIGINT进程消亡进程消亡第27页,本讲稿共74页什么是信号信号是由单个词组成的消息,例如红绿信号是由单个词组成的消息,例如红绿灯所发出的信息灯所发出的信息Ctrl-C时,内核向当前运行的进程发送中时,内核向当前运行的进程发送中断信号断信号每个信号都有一个数字编码。中断信号每个信号都有一个数字编码。中断信号编码通常是编码通常是2第28页,本讲稿共74页信号的来源信号来自内核信号来自内核生成信号的请求来自生成信号的请求来自3个地方:个地方:用户用户-通过输入通过输入Ctrl-C、Ctrl-等请求内等请求内核产生信号
18、核产生信号内核内核-进程执行出错时,内核向进程发进程执行出错时,内核向进程发送一个信号,例如非法段访问、浮点数送一个信号,例如非法段访问、浮点数溢出等,也可通知进程特定事件的发生。溢出等,也可通知进程特定事件的发生。进程进程-通过系统调用通过系统调用kill给另一个进程发给另一个进程发送信号。进程之间可通过信号通信送信号。进程之间可通过信号通信第29页,本讲稿共74页同步与异步信号由进程的某个操作产生的信号称为同步由进程的某个操作产生的信号称为同步信号,例如被零除信号,例如被零除用户击键这样的进程外的事件引起的信用户击键这样的进程外的事件引起的信号称为异步信号号称为异步信号第30页,本讲稿共7
19、4页信号列表信号编号及其名字可在信号编号及其名字可在/usr/include/signal.h文件中找到,例文件中找到,例如如SIGINT为中断信号,为中断信号,SIGQUIT退出信退出信号号,SIGSEGV非法段访问信号非法段访问信号可以使用信号消灭一个进程,也有办法可以使用信号消灭一个进程,也有办法保护自己不被杀死保护自己不被杀死第31页,本讲稿共74页进程处理信号的方法进程通过进程通过signal系统调用告诉内核如何处系统调用告诉内核如何处理信号理信号进程有进程有3个选择:个选择:(1)接受默认处理接受默认处理SIGINT默认处理为消亡,进程通过系统默认处理为消亡,进程通过系统调用调用s
20、ignal(SIGINT,SIG_DFL)恢复默认处恢复默认处理理(2)忽略信号忽略信号signal(SIGINT,SIG_IGN)系统调用告诉内系统调用告诉内核忽略该信号核忽略该信号第32页,本讲稿共74页进程处理信号的方法(3)调用一个函数,这是调用一个函数,这是3种方法中最强种方法中最强大的一个。大的一个。例如在例如在play_again3程序中,当用户输入程序中,当用户输入Ctrl-C时,程序收到信号后执行一个恢复时,程序收到信号后执行一个恢复设置的函数就不会发生上述情况了设置的函数就不会发生上述情况了程序能够告诉内核,当信号来时调用哪程序能够告诉内核,当信号来时调用哪个函数,个函数,
21、signal(SIGINT,function);信号到来时所调用的函数称为信号处理信号到来时所调用的函数称为信号处理函数函数第33页,本讲稿共74页signal系统调用目标目标简单的信号处理简单的信号处理头文件头文件#include 函数原型函数原型 result=signal(int signum,void(*action)(int);参数参数signum 需响应的信号需响应的信号action 如何响应如何响应返回值返回值-1 遇到错误遇到错误prevaction 返回之前的处理函数指针返回之前的处理函数指针第34页,本讲稿共74页signal系统调用其中其中action可以是函数名也可以是
22、如下两可以是函数名也可以是如下两种特殊值之一:种特殊值之一:SIG_IGN,忽略信号忽略信号SIG_DFL 将信号恢复为默认处理将信号恢复为默认处理signal返回前一个处理函数。值为指向该返回前一个处理函数。值为指向该函数的指针函数的指针第35页,本讲稿共74页信号处理的例子sigdemo1.c#include#includemain()voidf(int);/*declare the handler*/inti;signal(SIGINT,f);/*install the handler*/for(i=0;i5;i+)/*do something else*/printf(hellon);
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 第七讲 为用户编程终端控制和优秀课件 第七 用户 编程 终端 控制 优秀 课件
限制150内