第七讲 为用户编程终端控制和精选PPT.ppt

上传人:石*** 文档编号:88353823 上传时间:2023-04-25 格式:PPT 页数:74 大小:2.41MB
返回 下载 相关 举报
第七讲 为用户编程终端控制和精选PPT.ppt_第1页
第1页 / 共74页
第七讲 为用户编程终端控制和精选PPT.ppt_第2页
第2页 / 共74页
点击查看更多>>
资源描述

《第七讲 为用户编程终端控制和精选PPT.ppt》由会员分享,可在线阅读,更多相关《第七讲 为用户编程终端控制和精选PPT.ppt(74页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

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);

23、sleep(1);void f(int signum)/*this function is called*/printf(OUCH!n);第36页,本讲稿共74页信号处理过程main()signal(SIGINT,f);for(i=0;i5;i+)printf(“hellon”);sleep(1);正常控制流信号函数f()printf(“OUCH”);第37页,本讲稿共74页sigdemo1.c执行结果hellohellohellohelloCOUCH!hello第38页,本讲稿共74页忽略信号sigdemo2.c#include#includemain()signal(SIGINT,SIG_

24、IGN);printf(you cant stop me!n);while(1)sleep(1);printf(hahan);第39页,本讲稿共74页sigdemo2.c程序执行结果you cant stop me!hahahahaChahahahaChahahaha退出第40页,本讲稿共74页sigdemo2.c调用signal忽略中断信号,可以随意按Ctrl-C而不会对程序产生影响signal(SIGINT,SIG_IGNT)第41页,本讲稿共74页作业6.10第42页,本讲稿共74页处理多个信号当有多个信号到达进程时,该如何处理当有多个信号到达进程时,该如何处理?第43页,本讲稿共74页

25、1.捕鼠器问题信号处理函数有点像捕鼠器信号处理函数有点像捕鼠器早期版本中,在每次捕获之后,都必须早期版本中,在每次捕获之后,都必须重设它们。例如重设它们。例如void handler(int s)signal(SIGINT,handler);第44页,本讲稿共74页1.捕鼠器问题即使设置的速度非常快,它还是需要时即使设置的速度非常快,它还是需要时间间触发处理函数及重新设置完成之前,有触发处理函数及重新设置完成之前,有新的信号或者老鼠溜走新的信号或者老鼠溜走这一脆弱的间隙使得原有的信号处理不这一脆弱的间隙使得原有的信号处理不可靠,因此称为不可靠的信号可靠,因此称为不可靠的信号第45页,本讲稿共7

26、4页处理多个信号第二个信号打断第一个信号的处理第二个信号打断第一个信号的处理第二个信号被阻塞第二个信号被阻塞返回信号处理的地方是否要重新开始?返回信号处理的地方是否要重新开始?信号的优先级?信号的优先级?第46页,本讲稿共74页进程的多个信号处理函数每次使用之后都要禁用吗?处理函数每次使用之后都要禁用吗?如果如果SIGY消息在进程处理消息在进程处理SIGX消息时到消息时到达会发生什么?达会发生什么?如果进程还在处理前一个如果进程还在处理前一个SIGX时,第二个时,第二个SIGX又到来会发生什么事情呢?第三个呢又到来会发生什么事情呢?第三个呢?如果信号到来时,程序正在处理如果信号到来时,程序正在

27、处理getchar或或者者read之类的输入而阻塞,那会如何呢?之类的输入而阻塞,那会如何呢?第47页,本讲稿共74页测试多个信号sigdemo3.c程序signal(SIGINT,inthandler);/*set handler*/signal(SIGQUIT,quithandler);/*set handler*/do printf(nType a messagen);nchars=read(0,input,(INPUTLEN-1);if(nchars=-1)perror(read returned an error);else inputnchars=0;printf(You type

28、d:%s,input);while(strncmp(input,quit,4)!=0);第48页,本讲稿共74页void inthandler(int s)printf(Received signal%d.waitingn,s);sleep(2);printf(Leaving inthandler n);void quithandler(int s)printf(Received signal%d.waitingn,s);sleep(3);printf(Leaving quithandler n);第49页,本讲稿共74页执行结果Type a messagehelloyou typed:hel

29、loType a messageCReceived signal 3.Received signal 2.Leaving inthandlerLeaving quithandler第50页,本讲稿共74页各种实验(1)输入输入C C C C(2)C C(3)helloC Return(4)hello Return C(5)helloC第51页,本讲稿共74页第一种情况不可靠的信号不可靠的信号若两个若两个SIGINT信号杀死了进程,则系统信号杀死了进程,则系统是不可靠的信号是不可靠的信号若未杀死进程,则处理函数在被调用后若未杀死进程,则处理函数在被调用后还有作用还有作用现代信号处理机制允许在两者

30、之间选择现代信号处理机制允许在两者之间选择默认情况下,为后者默认情况下,为后者第一次实验的结果为:信号函数执行了第一次实验的结果为:信号函数执行了两次,后面的两次函数丢失两次,后面的两次函数丢失第52页,本讲稿共74页第二种情况:SIGY打断SIGX的处理 函数接连按下接连按下C和和时程序先跳到时程序先跳到inthandler,然后跳到然后跳到quithandler,然后再回到,然后再回到inthandler,最后回到主循环,最后回到主循环第二种情况的实验:接收到第二种情况的实验:接收到后,程序进入后,程序进入quithandler程序,接收到程序,接收到C后,进入后,进入inthandler

31、程序,最后返回到程序,最后返回到quithandler程程序序说明信号说明信号C打断信号打断信号第53页,本讲稿共74页第三种情况:SIGX打断SIGX的处理函数有三种可能:有三种可能:递归,调用同一个处理函数递归,调用同一个处理函数忽略第二个信号忽略第二个信号阻塞第二个信号直到第一个处理完毕阻塞第二个信号直到第一个处理完毕第三种方法最好,第三种方法最好,第54页,本讲稿共74页系统调用被中断例如当调用例如当调用read或者或者getchar函数时,程序函数时,程序接收到接收到C的信号的信号然后程序执行信号处理函数,执行完后,然后程序执行信号处理函数,执行完后,程序重新返回主循环程序重新返回主

32、循环程序是重新执行程序是重新执行read还是从还是从read返回同时返回同时设置设置errno为为EINTR呢?呢?第55页,本讲稿共74页实验结果:helloC Return时,程序无法接收到时,程序无法接收到hello输入输入hello Return C时,程序可接收到时,程序可接收到hellohelClo Return时,程序只接收到时,程序只接收到lo helloC时,无法得到时,无法得到hello输入,同输入,同时信号处理执行完后,重新开始时信号处理执行完后,重新开始read第56页,本讲稿共74页信号机制其他的弱点无法确定信号产生的原因无法确定信号产生的原因-早期的模型只是告诉了信

33、号的类型早期的模型只是告诉了信号的类型处理函数中无法安全阻塞其他消息处理函数中无法安全阻塞其他消息void inthandler(int s)int rv;void(*prev_qhandler)();prev_qhandler=signal(SIGQUIT,SIG_IGN);.signal(SIGQUIT,prev_qhandler);第57页,本讲稿共74页无法同时调用无法同时调用inthandler以及忽略以及忽略SIGQUIT无法阻塞无法阻塞SIGQUIT信号信号第58页,本讲稿共74页 sigaction可以处理多个信号目标目标指定信号的处理函数指定信号的处理函数头文件头文件#inc

34、lude 函数原型函数原型 result=signaction(int signum,const struct sigaction*action struct sigaction*prevaction);参数参数signum 需处理的信号需处理的信号action 指向描述操作的结构的指针指向描述操作的结构的指针prevaction指向描述被替换操作的结构指向描述被替换操作的结构指针指针返回值返回值-1 遇到错误遇到错误0 成功成功第59页,本讲稿共74页定制信号处理struct sigactionstruct sigactionvoid(*sa_handler)();void(*sa_siga

35、ction)(int,siginfo_t*,void*);sigset_t sa_mask;int sa_flags;其中其中sa_handler可以为可以为SIG_DFL,SIG_IGN或者函数名称,它是或者函数名称,它是老的信号处理方式老的信号处理方式第60页,本讲稿共74页sa_sigaction为新的信号处理机制为新的信号处理机制它可获得信号编号及被调用的原因及产它可获得信号编号及被调用的原因及产生问题的上下文的相关信息生问题的上下文的相关信息使用旧的处理机制:使用旧的处理机制:struct sigaction action;action.sa_handler=handler_old;

36、使用新的处理机制:使用新的处理机制:struct sigaction action;action.sa_sigaction=handler_new;将将sigaction中的标志位中的标志位sa_flags置为:置为:SA_SIGINFO第61页,本讲稿共74页sa_flags标志标记标记含义含义SA_RESETHAND当处理函数被调用时重置,即捕鼠当处理函数被调用时重置,即捕鼠器模式器模式SA_NODEFER处理信号时关闭信号自动阻塞,因处理信号时关闭信号自动阻塞,因此允许递归调用信号处理函数此允许递归调用信号处理函数SA_RESTART 当系统调用是针对一些慢速的设备当系统调用是针对一些慢

37、速的设备或类似的系统调用,重新开始而不或类似的系统调用,重新开始而不是返回是返回SA_SIGINFO指明使用指明使用sa_sigaction的处理函数的处理函数值。如果它未设置,则使用旧处理值。如果它未设置,则使用旧处理机制,若设置,则传给处理函数的机制,若设置,则传给处理函数的包括信号编号、信号产生的原因和包括信号编号、信号产生的原因和条件等信息条件等信息第62页,本讲稿共74页sigaction的例子struct sigaction newhandler;/*new settings */sigset_t blocked;/*set of blocked sigs*/void inthan

38、dler();/*the handler */char xINPUTLEN;/*load these two members first*/newhandler.sa_handler=inthandler;/*handler function */newhandler.sa_flags=SA_RESETHAND|SA_RESTART;/*options */*then build the list of blocked signals*/sigemptyset(&blocked);/*clear all bits */sigaddset(&blocked,SIGQUIT);/*add SIGQ

39、UIT to list*/newhandler.sa_mask=blocked;/*store blockmask */if(sigaction(SIGINT,&newhandler,NULL)=-1)perror(sigaction);第63页,本讲稿共74页防止数据损毁临界区临界区修改一个数据结构的代码若在运行时被打修改一个数据结构的代码若在运行时被打断,将导致数据的不完整或损毁断,将导致数据的不完整或损毁该代码称为临界区该代码称为临界区临界区不一定就在信号处理函数中临界区不一定就在信号处理函数中保护它的最简单的办法就是忽略或阻塞处保护它的最简单的办法就是忽略或阻塞处理函数将要使用或修改特

40、定数据的信号理函数将要使用或修改特定数据的信号第64页,本讲稿共74页阻塞信号:sigprocmask和sigsetop在信号处理一级或者进程一级阻塞信号在信号处理一级或者进程一级阻塞信号在处理一个信号时阻塞另一个信号,设在处理一个信号时阻塞另一个信号,设置置struct sigaction中的中的sa_mask成员位成员位sa_mask指定哪些信号要被阻塞指定哪些信号要被阻塞sa_mask类型为类型为sigset_t,它定义了信号集它定义了信号集合合第65页,本讲稿共74页进程的阻塞信号任何时候进程都有一些信号被阻塞,这任何时候进程都有一些信号被阻塞,这个信号的集合被称为信号挡板。个信号的集

41、合被称为信号挡板。系统调用系统调用sigprocmask可修改这个被阻塞可修改这个被阻塞的信号集的信号集sigprocmask是一个原子操作,根据所给是一个原子操作,根据所给的信号集来修改当前被阻塞的信号集的信号集来修改当前被阻塞的信号集第66页,本讲稿共74页sigprocmask目标修改当前的信号挡板头文件#include 函数原型 int result=sigprocmask(int how,const sigset_t*sigs,sigset_t*prev);参数how 如何修改信号挡板sigs 指向使用的信号列表的指针prev指向之前的信号挡板列表的指针或者为null返回值-1 遇到

42、错误0 成功第67页,本讲稿共74页how参数:参数:SIG_BLOCK、SIG_UNBLOCK或者或者SIG_SETSIG_SET表示设置信号集合表示设置信号集合*sigs所指定的信号将被添加、删除或者所指定的信号将被添加、删除或者替换替换之前的信号挡板设置将被复制到之前的信号挡板设置将被复制到*prev中中第68页,本讲稿共74页sigsetops构造信号集sigset_t是一个抽象的信号集是一个抽象的信号集通过函数添加或删除其中的信号通过函数添加或删除其中的信号sigemptyset(sigset_t*setp)清除由清除由setp指指向的列表中的所有信号向的列表中的所有信号sigfil

43、lset(sigset_t*setp)添加所有的信号添加所有的信号到到setp指向的列表中指向的列表中sigaddset(sigset_t*setp,int signum)添加添加信号信号signum到到setp指向的列表中指向的列表中sigdelset(sigset_t*setp,int signum)从从setp指向的列表中删除信号指向的列表中删除信号signum第69页,本讲稿共74页阻塞用户信号的例子sigset_t sigs,prevsigs;sigemptyset(&sigs);sigaddset(&sigs,SIGINT);sigaddset(&sigs,SIGQUIT);sig

44、procmask(SIG_BLOCK,&sigs,&prevsigs);sigprocmask(SIG_SET,*prevsigs,NULL);第70页,本讲稿共74页重入代码一个信号处理者或者一个一个信号处理者或者一个 函数,如果在函数,如果在激活状态下能被调用而不引起任何问题激活状态下能被调用而不引起任何问题就称之为可重入的。就称之为可重入的。sigaction时可以通过设置时可以通过设置SA_NODEFER位允许处理函数的递归调用位允许处理函数的递归调用若处理函数是不可重入的,则必须阻塞若处理函数是不可重入的,则必须阻塞信号信号若阻塞信号,则信号有可能丢失若阻塞信号,则信号有可能丢失第7

45、1页,本讲稿共74页kill 从另一个进程发送信号信号来自计时器、终端驱动、内核或者信号来自计时器、终端驱动、内核或者进程进程一进程可通过一进程可通过kill系统调用向另一个进程系统调用向另一个进程发送信号发送信号发送信号的进程的用户发送信号的进程的用户ID必须和目标进必须和目标进程的用户程的用户ID相同或者发送信号的进程拥相同或者发送信号的进程拥有者是一个超级用户有者是一个超级用户第72页,本讲稿共74页kill系统调用目标向一个进程发送信号头文件#include#include 函数原型 int kill(pid_t pid,int sig);参数pid 目标进程sig要被发送的信号返回值-1 遇到错误0 成功第73页,本讲稿共74页作业7.12第74页,本讲稿共74页

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 生活休闲 > 资格考试

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁