- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
第7章 Linux信号 郑谦益 韩京宇 7.1信号概述 进程拥有系统中的多种资源,各进程间除了共享内核外,所拥有的其他诸多资源彼此独立。 例如,进程拥有独立的用户地址空间和打开的文件描述符表等,一个进程不能直接访问其他进程的用户地址空间,也不能读写其他进程打开的文件。 7.1信号概述 实际应用中,一个系统或子系统通常由多个进程协同完成,各进程间往往需要通信,例如,传送数据、共享数据、同步控制和通知事件发生等。为了满足这些要求,Linux内核实现了对信号、管道和IPC的支持。 7.1信号概述 信号是内核与进程间通信的一种方式。内核为每个进程定义了多种信号,并定义了这些信号的处理方式。用户也可根据需要对信号的处理方式进行重新定义。 7.1信号概述 信号与中断不同: 中断由硬件产生,并通知内核,内核对中断的处理方式事先进行了定义; 信号则由内核产生,并发送给一个或一组进程的短消息,用一个特定的数字表示,不同的数字表示不同的信号,信号的作用是表示某种事件的发生。 7.1信号概述 三类信号API 信号的定义(signal, sigaction) 发送信号(kill,raise) 定时器(sleep, alarm) 7.2 Linux信号 (1) 用户 当用户在键盘上输入Ctrl+C或Ctrl+\等特殊字符组合时,终端驱动程序将通知内核产生信号,发送至相应的进程。 (2) 内核 内核在执行过程中,遇到非法指令和浮点数溢出等情况时,将产生相应的信号,并发送至对应的进程。 (3) 进程 一个进程调用kill函数向另一个进程发送信号,进行进程间通信。 7.2 Linux信号 信号的处理方式 通常,Linux为每个信号定义了缺省的处理方式,不同信号的处理方式不尽相同,这些处理方式包括忽略信号和终止进程等. 但用户可根据自身需要,对信号的处理方式进行重新定义。 7.2 Linux信号 内核在接收到信号后,未必马上对信号进行处理,而是选择在适当的时机,例如,而是在中断、异常或系统调用返回时,在将控制权切换至进程之际,处理所接收的信号。 对于用户进程,进程在收到信号后,暂停代码的执行,保存当前的运行环境,转而执行信号处理程序,在信号处理结束后,恢复中断点的运行环境,按正常流程继续执行。 7.2 信号的定义 void (*signal(int signum,void(* handler)(int)))(int); 定义信号的处理方式 signum 需设置的信号 handler 信号的处理方式 SIG_DFL 默认信号处理 SIG_IGN 忽略信号 Handler 新信号处理函数 7.3 信号的定义 #include stdio.h #include signal.h main() { void f(int); int i; signal( SIGINT, f ); for(i=0; i5; i++ ){ printf(hello\n); sleep(1); } } void f(int signum) { printf(hello Linux \n); } 7.3信号的定义 信号处理函数 用户定义的信号处理函数运行在用户空间,进程运行在用户空间中的任意点时,都可能被信号处理函数中断。因此,信号的处理是异步的。为了避免因异步信号处理导致对共享数据操作的不一致性,在设计信号处理函数时应遵守一定编码规则,在信号处理函数中应使用可重入函数。 7.3信号的定义 可重入函数 可重入函数是指一个可以被多个任务调用的函数,为了满足这一要求,在函数中不能使用全局变量或静态局部变量,因为它们的生存周期不会因为函数的结束而结束,而是要到整个进程的结束而消失,这样,就有可能被多个任务异步存取造成数据的不完整性。 在信号处理函数中应避免使用下列不可重入函数: 1) 函数体内使用了静态的数据结构; 2) 函数体内调用了malloc()或者free()函数; 3) 函数体内调用了标准I/O函数。 7.4发送信号 kill(pid_t pid,int signo) 向进程发送信号 pid0 进程ID为pid的进程 pid=0 同一个进程组的进程 pid0 pid!=-1 进程组ID为 -pid的所有进程 pid=-1 除发送进程自身外,所有进程ID大于1的进程 调用成功返回 0,否则,返回 -1。 7.5计时器 在Linux系统中,时钟用来计算系统运行的时间,记录每个进程使用CPU的时间,调度器可根据这些信息决定何时切换进程。有时,应用程序需要延迟一段时间后继续运行,可使用sleep函数实现延时功能。例如,程序7-9使进程延迟10秒后继续运行。 7.5计时器 #includesignal.
您可能关注的文档
- Access数据库应用基础教程(第三版) 作者 978-7-302-28361-4 ch08.ppt
- Access数据库应用基础教程(第三版) 作者 978-7-302-28361-4 ch09.ppt
- Access数据库应用基础教程(第三版) 作者 978-7-302-28361-4 ch10.ppt
- Access数据库应用基础教程(第三版) 作者 978-7-302-28361-4 ch11.ppt
- Access数据库应用基础教程(第三版) 作者 978-7-302-28361-4 ch12.ppt
- Access数据库应用基础教程(第三版) 作者 978-7-302-28361-4 ch13.ppt
- Access数据库应用基础教程(第三版) 作者 978-7-302-29896-0 ch02.ppt
- Access数据库应用基础教程(第三版) 作者 978-7-302-29896-0 ch03.ppt
- Access数据库应用基础教程(第三版) 作者 978-7-302-29896-0 ch05.ppt
- Access数据库应用基础教程(第三版) 作者 978-7-302-29896-0 ch06.ppt
- GNU_Linux编程 工业和信息化普通高等教育“十二五”规划教材立项项目 作者 郑谦益 第8章.ppt
- GNU_Linux编程 工业和信息化普通高等教育“十二五”规划教材立项项目 作者 郑谦益 第9章.ppt
- GNU_Linux编程 工业和信息化普通高等教育“十二五”规划教材立项项目 作者 郑谦益 第10章.ppt
- GSK系统数控车工技能训练 作者 胡旭兰 附录.ppt
- GSK系统数控车工技能训练 作者 胡旭兰 项目二.ppt
- GSK系统数控车工技能训练 作者 胡旭兰 项目六.ppt
- GSK系统数控车工技能训练 作者 胡旭兰 项目七.ppt
- GSK系统数控车工技能训练 作者 胡旭兰 项目四.ppt
- GSK系统数控车工技能训练 作者 胡旭兰 项目五.ppt
- GSK系统数控车工技能训练 作者 胡旭兰 项目一.ppt
文档评论(0)