16信号一资料讲解

上传人:yuzo****123 文档编号:143473609 上传时间:2020-08-30 格式:PPT 页数:68 大小:367.50KB
返回 下载 相关 举报
16信号一资料讲解_第1页
第1页 / 共68页
16信号一资料讲解_第2页
第2页 / 共68页
16信号一资料讲解_第3页
第3页 / 共68页
16信号一资料讲解_第4页
第4页 / 共68页
16信号一资料讲解_第5页
第5页 / 共68页
点击查看更多>>
资源描述

《16信号一资料讲解》由会员分享,可在线阅读,更多相关《16信号一资料讲解(68页珍藏版)》请在金锄头文库上搜索。

1、信号(一),第十六章,1,本章目标,中断 信号 信号与中断 signal,2,中断,中断是系统对于异步事件的响应 中断信号 中断源 现场信息 中断处理程序 中断向量表,3,信号,信号是UNIX系统响应某些状况而产生的事件,进程在接收到信号时会采取相应的行动。 信号是因为某些错误条件而产生的,比如内存段冲突、浮点处理器错误或者非法指令等 信号是在软件层次上对中断的一种模拟,所以通常把它称为是软中断,5,信号与中断,信号与中断的相似点: (1)采用了相同的异步通信方式; (2)当检测出有信号或中断请求时,都暂停正在执行的程序而转去执行相应的处理程序; (3)都在处理完毕后返回到原来的断点; (4)

2、对信号或中断都可进行屏蔽。 信号与中断的区别: (1)中断有优先级,而信号没有优先级,所有的信号都是平等的; (2)信号处理程序是在用户态下运行的,而中断处理程序是在核心态下运行; (3)中断响应是及时的,而信号响应通常都有较大的时间延迟。,6,信号的名称是在头文件 signal.h里定义的,信号名称,信号名称,进程对信号的三种响应,忽略信号 不采取任何操作、有两个信号不能被忽略:SIGKILL和SIGSTOP。 捕获并处理信号 内核中断正在执行的代码,转去执行先前注册过的处 执行默认操作 默认操作通常是终止进程,这取决于被发送的信号。,9,signal,typedef void (*_sig

3、handler_t) (int); #define SIG_ERR (_sighandler_t) -1) #define SIG_DFL (_sighandler_t) 0) #define SIG_IGN (_sighandler_t) 1) 函数原型: _sighandler_t signal(int signum, _sighandler_t handler); 参数 signal是一个带signum和handler两个参数的函数,准备捕捉或屏蔽的信号由参数signum给出,接收到指定信号时将要调用的函数由handler给出 handler这个函数必须有一个int类型的参数(即接收到的

4、信号代码),它本身的类型是void handler也可以是下面两个特殊值: SIG_IGN屏蔽该信号 SIG_DFL恢复默认行为,10,总结,中断 信号 信号与中断 signal,11,信号(二),第十七章,12,本章目标,信号分类 可靠信号与不可靠信号 信号发送 pause,13,信号分类,可靠信号 不可靠信号 实时信号 非实时信号,14,linux信号机制基本上是从unix系统中继承过来的。早期unix系统中的信号机制比较简单和原始,后来在实践中暴露出一些问题,它的主要问题是: 进程每次处理信号后,就将对信号的响应设置为默认动作。在某些情况下,将导致对信号的错误处理;因此,用户如果不希望这

5、样的操作,那么就要在信号处理函数结尾再一次调用signal(),重新安装该信号。 早期unix下的不可靠信号主要指的是进程可能对信号做出错误的反应以及信号可能丢失。 linux支持不可靠信号,但是对不可靠信号机制做了改进:在调用完信号处理函数后,不必重新调用该信号的安装函数(信号安装函数是在可靠机制上的实现)。因此,linux下的不可靠信号问题主要指的是信号可能丢失。,不可靠信号,随着时间的发展,实践证明了有必要对信号的原始机制加以改进和扩充。所以,后来出现的各种unix版本分别在这方面进行了研究,力图实现可靠信 号。由于原来定义的信号已有许多应用,不好再做改动,最终只好又新增加了一些信号,并

6、在一开始就把它们定义为可靠信号,这些信号支持排队,不会丢失。 同 时,信号的发送和安装也出现了新版本:信号发送函数sigqueue()及信号安装函数sigaction()。,可靠信号,实时信号,早期Unix系统只定义了32种信号,Ret hat7.2支持64种信号,编号0-63(SIGRTMIN=31,SIGRTMAX=63),将来可能进一步增加,这需要得到内核的支持。前32种信号已经有了预定义值,每个信号有了确定的用途及含义,并且每种信号都有各自的缺省动作。如按键盘的CTRL C时,会产生SIGINT信号,对该信号的默认反应就是进程终止。后32个信号表示实时信号,等同于前面阐述的可靠信号。这

7、保证了发送的多个实时信号都被接收。实时信号是POSIX标准的一部分,可用于应用进程。 非实时信号都不支持排队,都是不可靠信号;实时信号都支持排队,都是可靠信号。,信号发送,kill raise 给自己发送信号。raise(sig)等价于kill(getpid(), sig); killpg 给进程组发送信号。killpg(pgrp, sig)等价于kill(-pgrp, sig); sigqueue 给进程发送信号,支持排队,可以附带信息。,18,pause,将进程置为可中断睡眠状态。然后它调用schedule(),使linux进程调度器找到另一个进程来运行。 pause使调用者进程挂起,直到

8、一个信号被捕获,19,总结,信号分类 可靠信号与不可靠信号 信号发送 pause,20,信号(三),第十八章,21,本章目标,更多信号发送函数 可重入函数与不可重入函数 不可重入函数示例,22,更多信号发送函数,alarm setitimer abort,可重入函数,为了增强程序的稳定性,在信号处理函数中应使用可重入函数。 所谓可重入函数是指一个可以被多个任务调用的过程,任务在调用时不必担心数据是否会出错。因为进程在收到信号后,就将跳转到信号处理函数去接着执行。如果信号处理函数中使用了不可重入函数,那么信号处理函数可能会修改原来进程中不应该被修改的数据,这样进程从信号处理函数中返回接着执行时,

9、可能会出现不可预料的后果。不可再入函数在信号处理函数中被视为不安全函数。 满足下列条件的函数多数是不可再入的:(1)使用静态的数据结构,如getlogin(),gmtime(),getgrgid(),getgrnam(),getpwuid()以及getpwnam()等等;(2)函数实现时,调用了malloc()或者free()函数;(3)实现时使用了标准I/O函数的,总结,更多信号发送函数 可重入函数与不可重入函数 不可重入函数示例,25,信号(四),第十九章,26,本章目标,信号在内核中的表示 信号阻塞与未诀 信号集操作函数 sigprocmask,27,信号在内核中的表示(2-1),执行信

10、号的处理动作称为信号递达(Delivery),信号从产生到递达之间的状态,称为信号未决(Pending)。进程可以选择阻塞(Block)某个信号。被阻塞的信号产生时将保持在未决状态,直到进程解除对此信号的阻塞,才执行递达的动作。注意,阻塞和忽略是不同的,只要信号被阻塞就不会递达,而忽略是在递达之后可选的一种处理动作。信号在内核中的表示可以看作是这样的:,信号在内核中的表示(2-2),信号集操作函数,#include int sigemptyset(sigset_t *set); int sigfillset(sigset_t *set); int sigaddset(sigset_t *set

11、, int signo); int sigdelset(sigset_t *set, int signo); int sigismember(const sigset_t *set, int signo);,sigprocmask(2-1),#include int sigprocmask(int how, const sigset_t *set, sigset_t *oset); 功能:读取或更改进程的信号屏蔽字。 返回值:若成功则为0,若出错则为-1 如果oset是非空指针,则读取进程的当前信号屏蔽字通过oset参数传出。如果set是非空指针,则更改进程的信号屏蔽字,参数how指示如何更改

12、。如果oset和set都是非空指针,则先将原来的信号屏蔽字备份到oset里,然后根据set和how参数更改信号屏蔽字。假设当前的信号屏蔽字为mask,下表说明了how参数的可选值。,sigprocmask(2-2),how参数的含义,总结,信号在内核中的表示 信号阻塞与未诀 信号集操作函数 sigprocmask,33,信号(五),第二十章,34,本章目标,sigaction函数 sigaction结构体 sigaction示例,35,sigaction,包含头文件 功能:sigaction函数用于改变进程接收到特定信号后的行为。 原型: int sigaction(int signum,co

13、nst struct sigaction *act,const struct sigaction *old); 参数 该函数的第一个参数为信号的值,可以为除SIGKILL及SIGSTOP外的任何一 个特定有效的信号(为这两个信号定义自己的处理函数,将导致信号安装错误) 第二个参数是指向结构sigaction的一个实例的指针,在结构 sigaction的实例中,指定了对特定信号的处理,可以为空,进程会以缺省方式对信号处理 第三个参数oldact指向的对象用来保存原来对相应信号的处理,可指定oldact为NULL。 返回值:函数成功返回0,失败返回-1,sigaction结构体,第二个参数最为重要

14、,其中包含了对指定信号的处理、信号所传递的信息、信号处理函数执行过程中应屏蔽掉哪些函数等等,struct sigaction void (*sa_handler)(int); void (*sa_sigaction)(int, siginfo_t *, void *); sigset_t sa_mask; int sa_flags; void (*sa_restorer)(void); ;,总结,sigaction函数 sigaction结构体 sigaction示例,38,信号(六),第二十一章,39,本章目标,sigqueue函数 sigval联合体 sigqueue示例,40,sigqu

15、eue函数,功能:新的发送信号系统调用,主要是针对实时信号提出的支持信号带有参数,与函数sigaction()配合使用。 原型: int sigqueue(pid_t pid, int sig, const union sigval value); 参数 sigqueue的第一个参数是指定接收信号的进程id,第二个参数确定即将发送的信号,第三个参数是一个联合数据结构union sigval,指定了信号传递的参数,即通常所说的4字节值。 返回值成功返回0,失败返回-1,sigval联合体,sigqueue()比kill()传递了更多的附加信息,但sigqueue()只能向一个进程发送信号,而不能

16、发送信号给一个进程组。,typedef union sigval int sival_int; void *sival_ptr; sigval_t;,总结,sigqueue函数 sigval联合体 sigqueue示例,43,信号(七),第二十二章,44,本章目标,三种不同精度的睡眠 三种时间结构 setitimer getitimer,45,三种不同精度的睡眠,unsigned int sleep(unsigned int seconds); int usleep(useconds_t usec); int nanosleep(const struct timespec *req, struct timespec *rem);,46,三种时间结构,time_t struct timeval long tv_sec; /* seconds */ long tv_usec; /* microseconds */ ; struct timespec time_t tv_sec; /* seconds */ long tv_nsec; /* nanosecon

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

当前位置:首页 > 中学教育 > 教学课件 > 高中课件

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