为用户编程:终端控制和.ppt

上传人:ni****g 文档编号:571885861 上传时间:2024-08-12 格式:PPT 页数:74 大小:453.01KB
返回 下载 相关 举报
为用户编程:终端控制和.ppt_第1页
第1页 / 共74页
为用户编程:终端控制和.ppt_第2页
第2页 / 共74页
为用户编程:终端控制和.ppt_第3页
第3页 / 共74页
为用户编程:终端控制和.ppt_第4页
第4页 / 共74页
为用户编程:终端控制和.ppt_第5页
第5页 / 共74页
点击查看更多>>
资源描述

《为用户编程:终端控制和.ppt》由会员分享,可在线阅读,更多相关《为用户编程:终端控制和.ppt(74页珍藏版)》请在金锄头文库上搜索。

1、第七讲 为用户编程:终端控制和信号主要内容软件工具与用户程序软件工具与用户程序读取和修改终端驱动程序的设置读取和修改终端驱动程序的设置非阻塞输入非阻塞输入用户输入的超时用户输入的超时信号信号fcntl及及signal系统调用系统调用与终端有关的程序用户常用的程序例如用户常用的程序例如vi、emacs及许多游及许多游戏程序经常要有终端进行交互戏程序经常要有终端进行交互它们设置终端驱动程序的击键和输出处它们设置终端驱动程序的击键和输出处理方式理方式用户经常用到的几种用户终端设置:用户经常用到的几种用户终端设置:立即响应击键事件立即响应击键事件有限的输入集有限的输入集输入的超时输入的超时屏蔽屏蔽Ct

2、rl-C终端驱动程序的模式/*rotate.c*/#include #include 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$./rotateabx- cdbcdeefg C$输入的内容及程序所得到的内容rotate程序终端驱动程序显示器及键盘标准输入处理的特征程序未得到输入的程序未得到输入的x,因为删除了它,因为删除

3、了它击键的同时字符显示在屏幕上,但直到击键的同时字符显示在屏幕上,但直到按了回车,程序才接收到输入按了回车,程序才接收到输入C键结束输入并终止程序键结束输入并终止程序程序程序rotate并不负责这些事情,对于输入并不负责这些事情,对于输入的缓冲、回显、编辑和控制键处理都由的缓冲、回显、编辑和控制键处理都由驱动程序完成驱动程序完成标准输入处理的这些特征被启动时,将标准输入处理的这些特征被启动时,将终端连接称为规范模式终端连接称为规范模式非规范处理$stty -icanon;./rotateabbcxy?cddeeffggh$stty icanonstty -icanon命令关闭驱动程序中的规范模

4、式处命令关闭驱动程序中的规范模式处理理非规范模式没有缓冲,输入字母非规范模式没有缓冲,输入字母a,驱动,驱动程序跳过缓冲层,字符直接送到程序,然后程程序跳过缓冲层,字符直接送到程序,然后程序显示字符序显示字符b用户输入未缓冲可能会带来麻烦,如果用户想用户输入未缓冲可能会带来麻烦,如果用户想修改输入时,此时将无法修改修改输入时,此时将无法修改终端模式小结-规范模式是用户常见的模式是用户常见的模式输入的字符保存在缓冲区输入的字符保存在缓冲区接收到回车键时才将其中内容发送到程接收到回车键时才将其中内容发送到程序序缓冲功能使驱动程序可实现编辑功能,缓冲功能使驱动程序可实现编辑功能,例如删除字符、单词或

5、者行例如删除字符、单词或者行可通过命令可通过命令stty或者系统调用或者系统调用tcsetattr修修改执行上述操作的特定键改执行上述操作的特定键终端模式小结-非规范模式缓冲和编辑功能被关闭时,连接被称为缓冲和编辑功能被关闭时,连接被称为处于非规范模式处于非规范模式设备驱动器仍然进行特定字符的处理,设备驱动器仍然进行特定字符的处理,例如例如Ctrl-C及换行符及回车符之间的转换及换行符及回车符之间的转换删除单词、字符及终止编辑键将不具有删除单词、字符及终止编辑键将不具有特殊特殊 含义而是被视作常规的数据输入含义而是被视作常规的数据输入终端模式小结-raw模式每个处理步骤都被一个独立的位控制,例

6、如每个处理步骤都被一个独立的位控制,例如ISIG位控制位控制Ctrl-C是否用于终止一个程序是否用于终止一个程序程序可随意关闭所有这些处理步骤程序可随意关闭所有这些处理步骤当所有处理都被关闭后,驱动程序将输入直接当所有处理都被关闭后,驱动程序将输入直接传递给程序。这种模式就称为传递给程序。这种模式就称为raw模式模式stty raw命令命令编写一个用户程序:play_again.cplay_again.c的逻辑:的逻辑:对用户显示提示问题对用户显示提示问题接受输入接受输入如果是如果是y返回返回0如果是如果是n返回返回1第一个第一个play_again0.c程序程序play_again0.c的不

7、足必须先按必须先按 回车,程序才能接受到数据回车,程序才能接受到数据当用户按回车键时,程序接收整行的数当用户按回车键时,程序接收整行的数据对其进行处理,例如据对其进行处理,例如Do you want another transaction(y/n)? sure things u r e t h i n g 改进方法首先关闭规范输入,使得程序能够在用户敲键的同时首先关闭规范输入,使得程序能够在用户敲键的同时得到输入的字符得到输入的字符set_crmode() struct termios ttystate; tcgetattr( 0, &ttystate);/* read curr. setti

8、ng */ ttystate.c_lflag &= ICANON;/* no buffering*/ ttystate.c_ccVMIN = 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

9、); 程序的主要过程首先调用首先调用tty_mode(0)函数保存当前终端函数保存当前终端的设置信息的设置信息set_crmode()函数首先将终端置于一个字函数首先将终端置于一个字符接一个字符的模式符接一个字符的模式然后调用函数显示一个提示符,并获得然后调用函数显示一个提示符,并获得一个响应一个响应最后调用最后调用tty_mode(1)函数还原终端的设函数还原终端的设置置将终端置入字符输入模式包括两部分工将终端置入字符输入模式包括两部分工作:作:将将ICANON位关闭位关闭将控制字符数组中的将控制字符数组中的VMIN下标元素置一,下标元素置一,VMIN的值告诉驱动程序一次可以读取多的值告诉驱

10、动程序一次可以读取多少个字符少个字符编译执行play_again1程序此时,程序可以直接接收和处理字符而此时,程序可以直接接收和处理字符而不用等待回车键不用等待回车键但对每个非法字符都提示错误信息,可但对每个非法字符都提示错误信息,可能比较烦能比较烦可关闭回显模式,丢掉不需要的字符,可关闭回显模式,丢掉不需要的字符,直到得到可接收的字符为止直到得到可接收的字符为止在在set_crmode函数中加入语句函数中加入语句ttystate.c_lflag &=ECHO;阻塞与非阻塞输入当调用当调用getchar或者或者read等函数从文件描等函数从文件描述符读数据时,这些调用一直等待用户述符读数据时,

11、这些调用一直等待用户的输入,如果用户不输入,则继续等待,的输入,如果用户不输入,则继续等待,这种行为就术语阻塞输入这种行为就术语阻塞输入阻塞不仅仅是终端连接的属性,而且是阻塞不仅仅是终端连接的属性,而且是任何一个打开文件的属性任何一个打开文件的属性可使用可使用fcntl或者或者open ,通过开启,通过开启O_NDELAY标志为文件描述符启动非阻标志为文件描述符启动非阻塞输入。塞输入。非阻塞读取文件关闭文件描述符的阻塞状态,然后从中关闭文件描述符的阻塞状态,然后从中read时,结果如何呢?时,结果如何呢?如果能够获得输入,如果能够获得输入,read返回输入数据返回输入数据及字符个数,如果没有输

12、入字符,及字符个数,如果没有输入字符,read返回返回0,就像遇到文件末尾一样,有错误,就像遇到文件末尾一样,有错误,返回返回-1.每个文件都有一块保存未读取数据的地每个文件都有一块保存未读取数据的地方,若文件描述符置了方,若文件描述符置了O_NDELAY并且并且该空间为空,则该空间为空,则read返回返回0。play_again3.cget_response()intinput;printf(%s (y/n)?, question);/* ask*/fflush(stdout);/* force output*/while ( 1 )sleep(SLEEPTIME);/* wait a bi

13、t*/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*/BEEP;实验结果在输入后,程序会延时一会儿在输入后,程序会延时一会儿如果长时间不输入,程序也会退出如果长时间不输入,程序也会退出fflush(out)函数终端驱动对于输出也是一行行缓冲的终端驱动对于输出也是一行行缓冲的直到它收到一个换行符或者程序试图从直到它收到一个换行符或者程序试图从终

14、端读取数据时才会进行输出终端读取数据时才会进行输出而此时而此时getchar被延迟读入,因此通过该被延迟读入,因此通过该函数将提示信息输出到屏幕上,否则用函数将提示信息输出到屏幕上,否则用户将看不到提示信息。户将看不到提示信息。Ctrl -C执行上述程序时,如果输入执行上述程序时,如果输入Ctrl-C则程则程序终止运行,同时,也终止了整个登录序终止运行,同时,也终止了整个登录会话会话原因是什么呢?原因是什么呢?Ctrl -C设置O_NDELAY设置crmode显示提示符等待用户输入用户输入恢复tty设置恢复fcntl标志退出程序流程Ctrl C进程被终止进程正常退出时流向Ctrl -C程序接收

15、到程序接收到Ctrl-C后,会立即退出,此时后,会立即退出,此时,无法执行重置启动程序的代码,无法执行重置启动程序的代码返回返回shell并从用户获得命令行时,终端并从用户获得命令行时,终端仍处于非阻塞模式。仍处于非阻塞模式。shell调用调用read获取命令行,但是因为处获取命令行,但是因为处于非阻塞状态,于非阻塞状态,read立即返回立即返回0.这时这时shell程序就退出程序就退出原因总结:程序结束时,文件描述符处原因总结:程序结束时,文件描述符处于一个错误的状态。于一个错误的状态。信号Ctrl-C中断当前运行的程。这个中断由内核的中断当前运行的程。这个中断由内核的信号机制产生信号机制产

16、生Ctrl-C的过程:的过程:用户输入用户输入Ctrl-C驱动程序收到字符驱动程序收到字符匹配匹配VINTR和和ISIG的字符被开启的字符被开启驱动程序调用信号系统驱动程序调用信号系统信号系统发送信号系统发送SIGINT到进程到进程进程收到进程收到SIGINT进程消亡进程消亡什么是信号信号是由单个词组成的消息,例如红绿信号是由单个词组成的消息,例如红绿灯所发出的信息灯所发出的信息Ctrl-C时,内核向当前运行的进程发送中时,内核向当前运行的进程发送中断信号断信号每个信号都有一个数字编码。中断信号每个信号都有一个数字编码。中断信号编码通常是编码通常是2信号的来源信号来自内核信号来自内核生成信号的

17、请求来自生成信号的请求来自3个地方:个地方:用户用户-通过输入通过输入Ctrl-C、 Ctrl-等请求内等请求内核产生信号核产生信号内核内核-进程执行出错时,内核向进程发进程执行出错时,内核向进程发送一个信号,例如非法段访问、浮点数送一个信号,例如非法段访问、浮点数溢出等,也可通知进程特定事件的发生。溢出等,也可通知进程特定事件的发生。进程进程-通过系统调用通过系统调用kill给另一个进程发给另一个进程发送信号。进程之间可通过信号通信送信号。进程之间可通过信号通信同步与异步信号由进程的某个操作产生的信号称为同步由进程的某个操作产生的信号称为同步信号,例如被零除信号,例如被零除用户击键这样的进程

18、外的事件引起的信用户击键这样的进程外的事件引起的信号称为异步信号号称为异步信号信号列表信号编号及其名字可在信号编号及其名字可在/usr/include/signal.h文件中找到,例文件中找到,例如如SIGINT为中断信号,为中断信号,SIGQUIT退出信退出信号号,SIGSEGV非法段访问信号非法段访问信号可以使用信号消灭一个进程,也有办法可以使用信号消灭一个进程,也有办法保护自己不被杀死保护自己不被杀死进程处理信号的方法进程通过进程通过signal系统调用告诉内核如何处系统调用告诉内核如何处理信号理信号进程有进程有3个选择:个选择:(1)接受默认处理接受默认处理SIGINT默认处理为消亡,

19、进程通过系统默认处理为消亡,进程通过系统调用调用signal(SIGINT,SIG_DFL)恢复默认处恢复默认处理理(2)忽略信号忽略信号signal(SIGINT,SIG_IGN)系统调用告诉内系统调用告诉内核忽略该信号核忽略该信号进程处理信号的方法(3)调用一个函数,这是调用一个函数,这是3种方法中最强种方法中最强大的一个。大的一个。例如在例如在play_again3程序中,当用户输入程序中,当用户输入Ctrl-C时,程序收到信号后执行一个恢复时,程序收到信号后执行一个恢复设置的函数就不会发生上述情况了设置的函数就不会发生上述情况了程序能够告诉内核,当信号来时调用哪程序能够告诉内核,当信号

20、来时调用哪个函数,个函数,signal(SIGINT,function);信号到来时所调用的函数称为信号处理信号到来时所调用的函数称为信号处理函数函数signal系统调用目标目标简单的信号处理简单的信号处理头文件头文件#include 函数原型函数原型 result=signal (int signum,void (*action)(int);参数参数signum 需响应的信号需响应的信号action 如何响应如何响应返回值返回值-1 遇到错误遇到错误prevaction 返回之前的处理函数指针返回之前的处理函数指针signal系统调用其中其中action可以是函数名也可以是如下两可以是函数名

21、也可以是如下两种特殊值之一:种特殊值之一:SIG_IGN,忽略信号忽略信号SIG_DFL 将信号恢复为默认处理将信号恢复为默认处理signal返回前一个处理函数。值为指向该返回前一个处理函数。值为指向该函数的指针函数的指针信号处理的例子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);sleep(1);voi

22、d f(int signum)/* this function is called */printf(OUCH!n);信号处理过程main() signal(SIGINT,f); for(i=0;i5;i+) printf(“hellon”); sleep(1); 正常控制流信号函数f() printf(“OUCH”);sigdemo1.c执行结果hellohellohellohelloCOUCH!hello忽略信号sigdemo2.c#include#includemain()signal( SIGINT, SIG_IGN );printf(you cant stop me!n);while

23、( 1 )sleep(1);printf(hahan);sigdemo2.c程序执行结果you cant stop me!hahahahaChahahahaChahahaha退出sigdemo2.c调用signal忽略中断信号,可以随意按Ctrl-C而不会对程序产生影响signal(SIGINT,SIG_IGNT)作业6.10处理多个信号当有多个信号到达进程时,该如何处理当有多个信号到达进程时,该如何处理?1.捕鼠器问题信号处理函数有点像捕鼠器信号处理函数有点像捕鼠器早期版本中,在每次捕获之后,都必须早期版本中,在每次捕获之后,都必须重设它们。例如重设它们。例如void handler(int

24、 s) signal(SIGINT,handler);1.捕鼠器问题即使设置的速度非常快,它还是需要时即使设置的速度非常快,它还是需要时间间触发处理函数及重新设置完成之前,有触发处理函数及重新设置完成之前,有新的信号或者老鼠溜走新的信号或者老鼠溜走这一脆弱的间隙使得原有的信号处理不这一脆弱的间隙使得原有的信号处理不可靠,因此称为不可靠的信号可靠,因此称为不可靠的信号处理多个信号第二个信号打断第一个信号的处理第二个信号打断第一个信号的处理第二个信号被阻塞第二个信号被阻塞返回信号处理的地方是否要重新开始?返回信号处理的地方是否要重新开始?信号的优先级?信号的优先级?进程的多个信号处理函数每次使用之

25、后都要禁用吗?处理函数每次使用之后都要禁用吗?如果如果SIGY消息在进程处理消息在进程处理SIGX消息时到消息时到达会发生什么?达会发生什么?如果进程还在处理前一个如果进程还在处理前一个SIGX时,第二个时,第二个SIGX又到来会发生什么事情呢?第三个呢又到来会发生什么事情呢?第三个呢?如果信号到来时,程序正在处理如果信号到来时,程序正在处理getchar或或者者read之类的输入而阻塞,那会如何呢?之类的输入而阻塞,那会如何呢?测试多个信号sigdemo3.c程序signal( SIGINT, inthandler );/* set handler */signal( SIGQUIT, qu

26、ithandler );/* 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 typed: %s, input); while( strncmp( input , quit , 4 ) != 0 );void inthandler(int s)printf( Received signal %d . waitingn, s )

27、;sleep(2);printf( Leaving inthandler n);void quithandler(int s)printf( Received signal %d . waitingn, s );sleep(3);printf( Leaving quithandler n);执行结果Type a messagehelloyou typed:helloType a messageCReceived signal 3.Received signal 2.Leaving inthandlerLeaving quithandler各种实验(1)输入输入C C C C(2) C C(3)

28、helloC Return(4)hello Return C(5) helloC第一种情况不可靠的信号不可靠的信号若两个若两个SIGINT信号杀死了进程,则系统信号杀死了进程,则系统是不可靠的信号是不可靠的信号若未杀死进程,则处理函数在被调用后若未杀死进程,则处理函数在被调用后还有作用还有作用现代信号处理机制允许在两者之间选择现代信号处理机制允许在两者之间选择默认情况下,为后者默认情况下,为后者第一次实验的结果为:信号函数执行了第一次实验的结果为:信号函数执行了两次,后面的两次函数丢失两次,后面的两次函数丢失第二种情况:SIGY打断SIGX的处理 函数接连按下接连按下C和和时程序先跳到时程序先

29、跳到inthandler,然后跳到然后跳到quithandler,然后再回到,然后再回到inthandler,最后回到主循环,最后回到主循环第二种情况的实验:接收到第二种情况的实验:接收到后,程序进入后,程序进入quithandler程序,接收到程序,接收到C后,进入后,进入inthandler程序,最后返回到程序,最后返回到quithandler程程序序说明信号说明信号C打断信号打断信号第三种情况: SIGX打断SIGX的处理函数有三种可能:有三种可能:递归,调用同一个处理函数递归,调用同一个处理函数忽略第二个信号忽略第二个信号阻塞第二个信号直到第一个处理完毕阻塞第二个信号直到第一个处理完毕

30、第三种方法最好,第三种方法最好,系统调用被中断例如当调用例如当调用read或者或者getchar函数时,程序函数时,程序接收到接收到C的信号的信号然后程序执行信号处理函数,执行完后,然后程序执行信号处理函数,执行完后,程序重新返回主循环程序重新返回主循环程序是重新执行程序是重新执行read还是从还是从read返回同时返回同时设置设置errno为为EINTR呢?呢?实验结果:helloC Return时,程序无法接收到时,程序无法接收到hello输入输入hello Return C时,程序可接收到时,程序可接收到hellohelClo Return时,程序只接收到时,程序只接收到lo hello

31、C时,无法得到时,无法得到hello输入,同输入,同时信号处理执行完后,重新开始时信号处理执行完后,重新开始read信号机制其他的弱点无法确定信号产生的原因无法确定信号产生的原因-早期的模型只是告诉了信号的类型早期的模型只是告诉了信号的类型处理函数中无法安全阻塞其他消息处理函数中无法安全阻塞其他消息void inthandler(int s) int rv; void(*prev_qhandler)(); prev_qhandler=signal(SIGQUIT,SIG_IGN); . signal(SIGQUIT, prev_qhandler);无法同时调用无法同时调用inthandler以

32、及忽略以及忽略SIGQUIT无法阻塞无法阻塞SIGQUIT信号信号 sigaction可以处理多个信号目标目标指定信号的处理函数指定信号的处理函数头文件头文件#include 函数原型函数原型 result=signaction (int signum,const struct sigaction *action struct sigaction *prevaction);参数参数signum 需处理的信号需处理的信号action 指向描述操作的结构的指针指向描述操作的结构的指针prevaction指向描述被替换操作的结构指向描述被替换操作的结构指针指针返回值返回值-1 遇到错误遇到错误0 成

33、功成功定制信号处理struct sigactionstruct sigactionvoid (*sa_handler)();void (*sa_sigaction)(int,siginfo_t *,void *);sigset_t sa_mask;int sa_flags;其中其中sa_handler可以为可以为SIG_DFL,SIG_IGN或者函数名称,它是或者函数名称,它是老的信号处理方式老的信号处理方式sa_sigaction为新的信号处理机制为新的信号处理机制它可获得信号编号及被调用的原因及产它可获得信号编号及被调用的原因及产生问题的上下文的相关信息生问题的上下文的相关信息使用旧的处理

34、机制:使用旧的处理机制:struct sigaction action;action.sa_handler=handler_old;使用新的处理机制:使用新的处理机制:struct sigaction action;action.sa_sigaction=handler_new;将将sigaction中的标志位中的标志位sa_flags置为:置为:SA_SIGINFOsa_flags标志标记标记含义含义SA_RESETHAND当处理函数被调用时重置,即捕鼠当处理函数被调用时重置,即捕鼠器模式器模式SA_NODEFER处理信号时关闭信号自动阻塞,因处理信号时关闭信号自动阻塞,因此允许递归调用信号

35、处理函数此允许递归调用信号处理函数SA_RESTART 当系统调用是针对一些慢速的设备当系统调用是针对一些慢速的设备或类似的系统调用,重新开始而不或类似的系统调用,重新开始而不是返回是返回SA_SIGINFO指明使用指明使用sa_sigaction的处理函数的处理函数值。如果它未设置,则使用旧处理值。如果它未设置,则使用旧处理机制,若设置,则传给处理函数的机制,若设置,则传给处理函数的包括信号编号、信号产生的原因和包括信号编号、信号产生的原因和条件等信息条件等信息sigaction的例子struct sigaction newhandler; /* new settings */sigset_

36、t blocked; /* set of blocked sigs */void inthandler(); /* 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(&blo

37、cked); /* clear all bits */sigaddset(&blocked, SIGQUIT);/* add SIGQUIT to list */newhandler.sa_mask = blocked; /* store blockmask */if ( sigaction(SIGINT, &newhandler, NULL) = -1 )perror(sigaction);防止数据损毁临界区临界区修改一个数据结构的代码若在运行时被打修改一个数据结构的代码若在运行时被打断,将导致数据的不完整或损毁断,将导致数据的不完整或损毁该代码称为临界区该代码称为临界区临界区不一定就在信号

38、处理函数中临界区不一定就在信号处理函数中保护它的最简单的办法就是忽略或阻塞处保护它的最简单的办法就是忽略或阻塞处理函数将要使用或修改特定数据的信号理函数将要使用或修改特定数据的信号阻塞信号:sigprocmask和sigsetop在信号处理一级或者进程一级阻塞信号在信号处理一级或者进程一级阻塞信号在处理一个信号时阻塞另一个信号,设在处理一个信号时阻塞另一个信号,设置置struct sigaction中的中的sa_mask成员位成员位sa_mask指定哪些信号要被阻塞指定哪些信号要被阻塞sa_mask类型为类型为sigset_t,它定义了信号集它定义了信号集合合进程的阻塞信号任何时候进程都有一些

39、信号被阻塞,这任何时候进程都有一些信号被阻塞,这个信号的集合被称为信号挡板。个信号的集合被称为信号挡板。系统调用系统调用sigprocmask可修改这个被阻塞可修改这个被阻塞的信号集的信号集sigprocmask是一个原子操作,根据所给是一个原子操作,根据所给的信号集来修改当前被阻塞的信号集的信号集来修改当前被阻塞的信号集sigprocmask目标修改当前的信号挡板头文件#include 函数原型 int result=sigprocmask (int how,const sigset_t *sigs,sigset_t *prev);参数how 如何修改信号挡板sigs 指向使用的信号列表的指

40、针prev指向之前的信号挡板列表的指针或者为null返回值-1 遇到错误0 成功how参数:参数:SIG_BLOCK、SIG_UNBLOCK或者或者SIG_SETSIG_SET表示设置信号集合表示设置信号集合*sigs所指定的信号将被添加、删除或者所指定的信号将被添加、删除或者替换替换之前的信号挡板设置将被复制到之前的信号挡板设置将被复制到*prev中中sigsetops构造信号集sigset_t是一个抽象的信号集是一个抽象的信号集通过函数添加或删除其中的信号通过函数添加或删除其中的信号sigemptyset(sigset_t *setp) 清除由清除由setp指指向的列表中的所有信号向的列表

41、中的所有信号sigfillset(sigset_t *setp) 添加所有的信号添加所有的信号到到setp指向的列表中指向的列表中sigaddset(sigset_t *setp,int signum)添添加信号加信号signum到到setp指向的列表中指向的列表中sigdelset(sigset_t *setp,int signum)从从setp指向的列表中删除信号指向的列表中删除信号signum阻塞用户信号的例子sigset_t sigs,prevsigs;sigemptyset(&sigs);sigaddset(&sigs,SIGINT);sigaddset(&sigs,SIGQUIT)

42、;sigprocmask(SIG_BLOCK,&sigs,&prevsigs);sigprocmask(SIG_SET,*prevsigs,NULL);重入代码一个信号处理者或者一个一个信号处理者或者一个 函数,如果在函数,如果在激活状态下能被调用而不引起任何问题激活状态下能被调用而不引起任何问题就称之为可重入的。就称之为可重入的。sigaction时可以通过设置时可以通过设置SA_NODEFER位允许处理函数的递归调用位允许处理函数的递归调用若处理函数是不可重入的,则必须阻塞若处理函数是不可重入的,则必须阻塞信号信号若阻塞信号,则信号有可能丢失若阻塞信号,则信号有可能丢失kill 从另一个进程发送信号信号来自计时器、终端驱动、内核或者信号来自计时器、终端驱动、内核或者进程进程一进程可通过一进程可通过kill系统调用向另一个进程系统调用向另一个进程发送信号发送信号发送信号的进程的用户发送信号的进程的用户ID必须和目标进必须和目标进程的用户程的用户ID相同或者发送信号的进程拥相同或者发送信号的进程拥有者是一个超级用户有者是一个超级用户kill系统调用目标向一个进程发送信号头文件#include #include 函数原型 int kill (pid_t pid, int sig);参数pid 目标进程sig要被发送的信号返回值-1 遇到错误0 成功作业7.12

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 高等教育 > 研究生课件

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号