Linux程序设计第7章_第1页
Linux程序设计第7章_第2页
Linux程序设计第7章_第3页
Linux程序设计第7章_第4页
Linux程序设计第7章_第5页
已阅读5页,还剩22页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、嵌入式操作系统应用开发嵌入式操作系统应用开发-Linux程序设计程序设计陈晓雷第第7章章 信号处理信号处理n7.1信号概念n7.2UNIX 信号n7.3生成信号n7.4设置信号的动作n7.5信号句柄n7.6阻塞信号n7.7等待信号n7.8使用分开的信号栈n7.9信号句柄编程技巧n7.10实时信号37.1信号概念信号概念l信号是异步传送给进程的一种事件通知信号是异步传送给进程的一种事件通知l产生信号的原因(生成信号的事件)产生信号的原因(生成信号的事件)l程序出错程序出错l外部事件外部事件l显式请求显式请求l同步信号:与程序中的某个具体操作相关并且同步信号:与程序中的某个具体操作相关并且在那个操

2、作进行的同时产生在那个操作进行的同时产生l异步信号:进程之外的事件生成的信号异步信号:进程之外的事件生成的信号47.1信号概念信号概念l信号发生时,进程采取的动作信号发生时,进程采取的动作l忽略信号:忽略信号:SIGSTOP、SIGKILL除外除外l捕获信号:捕获函数(句柄)对信号进行专门的处理捕获信号:捕获函数(句柄)对信号进行专门的处理l执行系统默认动作执行系统默认动作l流产流产Core:终止进程,并且生成内存转储文件:终止进程,并且生成内存转储文件corel终止终止Term:终止进程,不生成内存转储文件:终止进程,不生成内存转储文件l忽略忽略Ign:忽略信号:忽略信号l挂起挂起Stop:

3、暂停进程:暂停进程l继续继续Cont:暂停的进程恢复执行:暂停的进程恢复执行l信号相关术语信号相关术语l生成、发送、交付、接收、捕获、悬挂、屏蔽字、阻塞生成、发送、交付、接收、捕获、悬挂、屏蔽字、阻塞7.2UNIX 信号信号l系统为每一种可能的事件定义了一种信号,每系统为每一种可能的事件定义了一种信号,每种信号有一个种信号有一个信号数信号数,并对应有信号名,并对应有信号名SIGl/usr/include/signal.h = asm/signal.hlman 7 signallkill ll表表7-1l空信号空信号0lvoid psignal(int signo, const char *ms

4、g);57.2UNIX 信号信号l7.2.1程序错误类信号程序错误类信号179l7.2.2程序中止类信号程序中止类信号180l7.2.3闹钟类信号闹钟类信号 180l7.2.4I/O类信号类信号180l7.2.5作业控制类信号作业控制类信号181l7.2.6操作错误类信号操作错误类信号181l7.2.7其他信号其他信号67.3生成信号生成信号l硬件自陷、程序错误硬件自陷、程序错误l终端控制字符和终端控制字符和shell命令命令lCtrl-clstty alkill(1)l函数函数labortlalarm77.3生成信号生成信号l7.3.1raise()函数函数lint raise (int s

5、ig);l进程给自己发送信号进程给自己发送信号siglraise()会阻塞,句柄函数返回时,才会返回会阻塞,句柄函数返回时,才会返回l7.3.2kill()函数函数lint kill(pid_t, int sig);l发送信号给一个进程或一组进程发送信号给一个进程或一组进程l参数参数lpid0: 指定进程指定进程lpid=0: 所在组的所有进程进程所在组的所有进程进程lpidexec()):信号要么忽略,要么默认动):信号要么忽略,要么默认动作作l后台进程:忽略中断和结束信号(后台进程:忽略中断和结束信号(SIGINT和和SIGQUIT)lsignal()的局限性:的局限性:l无法单独查看信号

6、的当前动作无法单独查看信号的当前动作l不可靠不可靠117.4设置信号的动作设置信号的动作l7.4.3不可靠信号不可靠信号catch_sigquit()/存在存在时间窗时间窗,可能接收到,可能接收到SIGQUIT信号,用默认动作处理,终止冰屑信号,用默认动作处理,终止冰屑core文件文件signal(SIGQUIT, catch_sigquit); /系统系统Vmain()signal(SIGQUIT, catch_sigquit);BSD扩充了扩充了signal()系统调用,可以阻塞新到达的信号从而避免时间窗问题系统调用,可以阻塞新到达的信号从而避免时间窗问题127.4设置信号的动作设置信号的

7、动作l7.4.4sigaction()函数函数lint sigaction(int signum, const struct sigaction *act, struct sigaction *oact);lsigaction()用来检查或指定与特定信号有关的动作l参数signum:除SIGHILL和SIGSTOP外的任何信号l参数act:NULL或指定动作l参数oact:NULL或返回先前的动作l返回值:成功0,失败-1lstruct sigaction void (*sa_handler)();/传统信号句柄、SIG_DFL、SIG_IGNvoid (*sa_sigaction)(int,

8、 siginfo_t *, void *);/另一信号句柄sigset_t sa_mask;/信号句柄执行期间要阻塞的一组信号int sa_flags;/若干控制标志组合137.4设置信号的动作设置信号的动作l7.4.4sigaction()函数函数147.5信号句柄信号句柄l信号句柄信号句柄信号捕获函数,信号到达时调用信号捕获函数,信号到达时调用l两种基本策略两种基本策略l句柄函数仅做简单处理,设置标志,正常返回句柄函数仅做简单处理,设置标志,正常返回l对信号适当处理,然后让句柄终止程序运行对信号适当处理,然后让句柄终止程序运行l7.5.1正常返回的信号句柄正常返回的信号句柄l用于此策略的信

9、号:用于此策略的信号:SIGALRM、I/O、进程通信、进程通信的信号的信号lsig_atomic_t数据类型数据类型l例:例:p7-4.c157.5信号句柄信号句柄l7.5.2终止进程的句柄终止进程的句柄l用于此策略的信号:程序错误信号和交互中断信号用于此策略的信号:程序错误信号和交互中断信号l句柄函数通常完成一次必要的清场工作、报告错误句柄函数通常完成一次必要的清场工作、报告错误、终止程序的运行、终止程序的运行l终止运行的两种方法:终止运行的两种方法:l调用调用exit()或或abort()l设置信号默认动作,再次生成同一信号设置信号默认动作,再次生成同一信号l典型代码典型代码167.6阻

10、塞信号阻塞信号l阻塞信号阻塞信号操作系统保持该信号并推迟它的发送操作系统保持该信号并推迟它的发送l被阻塞的信号不会丢失,只是暂时悬挂,直到阻塞解除被阻塞的信号不会丢失,只是暂时悬挂,直到阻塞解除l每个进程有一个信号屏蔽字,它包含当前被阻塞的信号的集合每个进程有一个信号屏蔽字,它包含当前被阻塞的信号的集合l7.6.1sigset_t类型和信号集操作类型和信号集操作lsigset_t类型表示的信号集合只能用下属五个函数来操作类型表示的信号集合只能用下属五个函数来操作lint sigemptyset(sigset_t *set);lint sigfillset(sigset_t *set);lint

11、 sigaddset(sigset_t *set, int signo);lint sigdelset(sigset_t *set , int signo);lint sigismember(sigset_t *set , int signo);177.6阻塞信号阻塞信号l7.6.2设置信号屏蔽设置信号屏蔽l信号屏蔽继承于其父进程信号屏蔽继承于其父进程l改变信号屏蔽的途径改变信号屏蔽的途径lsigaction()仅信号句柄执行期间起作用仅信号句柄执行期间起作用lsigprocmask()lint sigprocmask(int how, const sigset_t *set, sigset_

12、t *oset);lhow: SIG_BLOCK、 SIG_UNBLOCK、 SIG_SETMASKlset: NULL、新的信号集合、新的信号集合loset: NULL、老的信号集合、老的信号集合l不能阻塞不能阻塞SIGKILL和和SIGSTOPl例:例:p7-5.c187.6阻塞信号阻塞信号l7.6.3检查悬挂信号检查悬挂信号l悬挂信号:已经发生但由于阻塞环未交付的信号悬挂信号:已经发生但由于阻塞环未交付的信号lint sigpending(sigset_t *set);l查看悬挂信号并存于查看悬挂信号并存于setl例:例:p7-6.c197.7等待信号等待信号l等待信号方法等待信号方法l

13、忙等待忙等待lpause()和和sigsuspend()l7.7.1pause()函数函数lint pause(void);l悬挂调用进程直到有信号到达悬挂调用进程直到有信号到达l返回返回-1并并errno=EINTRl使用简单,但不可靠使用简单,但不可靠l分析代码分析代码207.7等待信号等待信号l7.7.2sigsuspend()函数函数lint sigsuspend(const sigset_t *sigmask);l参数参数sigmask所指的信号集临时替代调用进程的信所指的信号集临时替代调用进程的信号屏蔽字,然后挂起调用进程,直到有不属于号屏蔽字,然后挂起调用进程,直到有不属于sigmask的信号到达为止的信号到达为止l返回返回-1并并errno=EINTRl可靠可靠l分析代码分析代码l例:例:p7-7.c217.8使用分开的信号栈使用分开的信号栈227.9信号句柄编程技巧信号句柄编程技巧l7.9.1句柄内非局部控制转移句柄内非局部控制转移l7.9.2可重入函数与异步信号安全函数可重入函数与异步信号安全函数l7.9.3被信号中断的系统调用被信号中断的系统调用l7.9.4原子数据原子数据237.10实时信号实时信号l7.10.1SA_SIGINFO标志标志l7.1

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论