![信号的传递_徐波_第1页](http://file2.renrendoc.com/fileroot_temp3/2021-7/3/f9646599-8097-49b3-bd59-815593c15178/f9646599-8097-49b3-bd59-815593c151781.gif)
![信号的传递_徐波_第2页](http://file2.renrendoc.com/fileroot_temp3/2021-7/3/f9646599-8097-49b3-bd59-815593c15178/f9646599-8097-49b3-bd59-815593c151782.gif)
![信号的传递_徐波_第3页](http://file2.renrendoc.com/fileroot_temp3/2021-7/3/f9646599-8097-49b3-bd59-815593c15178/f9646599-8097-49b3-bd59-815593c151783.gif)
![信号的传递_徐波_第4页](http://file2.renrendoc.com/fileroot_temp3/2021-7/3/f9646599-8097-49b3-bd59-815593c15178/f9646599-8097-49b3-bd59-815593c151784.gif)
![信号的传递_徐波_第5页](http://file2.renrendoc.com/fileroot_temp3/2021-7/3/f9646599-8097-49b3-bd59-815593c15178/f9646599-8097-49b3-bd59-815593c151785.gif)
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、信号的传递 徐波 Embedded System Lab 2014 信号传递 信号传递有两个阶段?信号传递有两个阶段? 信号产生:信号产生:内核更新目标进程的数据结构 以表示一个新信号已被发送; 信号传递信号传递:内核强迫目标进程通过以下方 式对信号做出反应:或改变目标进程的执 行状态,或开始执行一个特定的信号处理 程序,或者两者都是。 已经产生但还没有传递的信号称为挂起信号已经产生但还没有传递的信号称为挂起信号 一、信号的传递-引言 假定内核已经注意到一个信号的到来,并 调用相应的函数为接收此信号的进程准备描 述符。但是万一这个进程在那一刻并不在 CPU上运行,内核就延迟传递信号的任务。 那
2、么我们现在就转向另一个主题,即为确保确保 进程的挂起信号得到处理内核所执行的操作进程的挂起信号得到处理内核所执行的操作 。 二、检查信号队列的时间 内核何时检查信号队列? 内核在允许进程恢复用户态下的执行之前 ,会检查进程TIF_SIGPENDING标志的值 。(该标志表示进程是否有非阻塞的挂起 信号,1为真) 每当内核处理完一个中断或异常时,就检 查是否存在挂起的信号。 三、处理挂起信号 如何处理非阻塞的挂起信号量?如何处理非阻塞的挂起信号量? 为了处理非阻塞的挂起信号,内核调用 do_signal()函数进行处理; 阻塞信号阻塞信号:如果一个信号被设置为阻塞, 那么当信号产生的时候,它会与
3、正常的信 号一样被传递给进程,但是只有进程解除 对信号阻塞时才会被处理。 挂起信号挂起信号:已经生成但是还未被传递的信 号。 挂起信号-略讲 任何时候,一个进程仅存在给定类型的一个挂起信号一个进程仅存在给定类型的一个挂起信号,同 一进程同种类型的其他信号不被排队,只被简单的丢弃。 但是实时信号不同:同种类型的挂起信号可以有好几个但是实时信号不同:同种类型的挂起信号可以有好几个 信号的挂起时间长度往往不可预知信号的挂起时间长度往往不可预知,原因在于: 信号通常只被current进程传递 进程可以选择阻塞某种信号进程可以选择阻塞某种信号。这种情况下,在取消阻 塞之前进程将不接收这个信号 当进程执行
4、一个信号处理程序函数时,通常屏蔽相应 的信号,即自动阻塞这个信号直到处理程序结束。因 此,所处理的信号的另一次出现不能中断信号处理程 序 四、 do_signal()函数 do_signal()函数接受两个参数:函数接受两个参数: regs:栈区的地址:栈区的地址,存放当前进程在用户状态下寄存器的 内容 oldset:变量的地址:变量的地址,假设存放阻塞信号的位掩码数组, 如果没有必要保存位掩码数组,这它为NULL struct pt_regs *regs; /pt_regs结构,指向当前进程 内核态堆栈中保存的寄存器 sigset_t *oldset; /信号处理程序执行时要屏蔽的信号 二、
5、检查信号队列的时间 时间:时间:通常只是在CPU要返回到用户态时才被调用do_signal()函 数。 四 do_signal()函数的核心 do_signal()函数核心:函数核心: 循环调用dequeue_signal()函数,直到在私有挂起队 列和共享挂起队列中都没有非阻塞的挂起信号 dequeue_signal()函数首先考虑私有挂起队列,并从 最低编号开始,然后再共享队列;处理完后更新数 据结构以表示信号不再挂起: 清位:currunt-pending.signal 此时程序将会忽略该信号,处理队列中的下一个信号 事实上,由于UNIX的历史原因,要想不产生僵尸进程还有另外一种办法:父
6、进程调用 sigaction将SIGCHLD的处理动作置为SIG_IGN,这样fork出来的子进程在终止时会自动 清理掉,不会产生僵尸进程,也不会通知父进程。系统默认的忽略动作和用户用 sigaction函数自定义的忽略通常是没有区别的,但这是一个特例。此方法对于Linux可用 陈香兰老师 能被忽略的信号能被忽略的信号 2、执行缺省操作 (1)init进程:进程: if(currunt-pid=1) continue; (2)Ignore信号:信号: if(signr=SIGCONT| signr=SIGCHLD| signr=SIGURE| signr=SIGWINTH) continue;
7、 Signr: dequeue_signal()返回值,如果为0,则说明所有挂起的信号 已被处理完,否则还有挂起队列等待处理。 (3)STOP信号:信号: if(signr=SIGSTOP| signr=SIGTSTP| signr=SIGTTIN| signr=SIGTTOUT)) if(signr!=SIGSTOP do_signal_stop(signr); SIGSTOP总是停止线程组,其它只停止不在不在孤儿进程的线程组 do_signal_stop()检查currunt是否是线程组中第一个被停止的进程第一个被停止的进程,是则激 活“组停止”; 将进程状态置为TASK_STOPPED,并调用schedule(); 如果线程组组长的父进程没有设置SIGCHLD的SA_NOCLDSTOP标志,则向他发送 SIGCHLD信号! 根据信号的类型,根据信号的类型, 使用使用switch语句语句 找到对应的缺省找到对应的缺省 处理方式处理方式 (4)DUMP信号:信号:进程被杀死 进进程的工作目录创建一个“转储”文件,
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年漳州货物从业资格证考试题
- 2025年宿迁普通货运从业资格证模拟考试
- LT高考一轮复习钠及其化合物
- 2024-2025学年四年级语文上册第三单元民族之花8中国结说课稿北师大版
- 2024-2025学年高中历史课时作业11俄国农奴制改革岳麓版选修1
- 2024年高考化学一轮复习一遍过专题37物质的分离和提纯含解析
- 2024-2025学年高中历史第三单元第二次世界大战3.11929-1933年资本主义经济危机课下提升演练新人教版选修3
- 2024-2025学年高中历史课时作业1先师孔子岳麓版选修4
- 2024-2025学年高中物理课时分层作业8电流的磁场含解析新人教版选修1-1
- 2025年高强度耐磨黄铜合金合作协议书
- GB/T 3860-1995文献叙词标引规则
- 2023年Beck自杀意念评估量表
- 七年级英语下册阅读理解10篇
- 设计质量、进度保证措施
- 医院评审工作临床科室资料盒目录(15个盒子)
- 汤姆走丢了 详细版课件
- Unit2 School life - 复习课课件 牛津译林版英语八年级上册
- 中医腰痛病个案护理
- 大学学院学生心理危机预防与干预工作预案
- 三级安全管理标准化评定标准
- 农光互补光伏电站项目土建主要施工方案
评论
0/150
提交评论