Minix3信号处理分析
进程的信号处理的相关结构
PM中存放着所有进程的进程描述符,在一个进程描述符中,有一个指针,指向一个sigaction结构二维数组中的一项,表示这个进程所有信号的操作.一个sigaction结构包含信号处理函数的起始地址,执行期间需要屏蔽的信号,以及表示如何处理信号的标志

代表一个进程对单个信号操作的Sigaction结构如下
进程描述符结构为mproc如下
信号处理流程
1、寻找接收信号的进程
进程A要发送信号,需要传入一个proc_id,指明接收信号的进程。PM中有一个数组,存放着所有进程的进程描述符,PM会遍历该数组,根据proc_id和进程A的相关信息去找到接收信号的进程。
进程描述符的mp_pid,mp_procgrp:

proc_id>0时,把信号发送到其mp_pid等于proc_id的进程
proc_id=0时,把信号发送到mp_procgrp等于A mp_procgrp的进程
proc_id=-1时,把信号发送到所有进程,除了swapper,unit和当前进程
proc_id<-1时,把信号发生到mp_procgrp等于-proc_id的所有进程
同时在决定进程能否发送信号的时候有一些条件,如检查真实uid和有效uid等
2、查看接收信号的进程对于信号的处理方式
具体位图查看末尾mproc结构
转化为信号
发送信号给系统进程
忽略信号:什么都不做
Ignore位图被置位
悬挂信号:将信号加入pending位图
1、mask位图置位
2、进程处于等待调用状态,并且停止等待失败
3、被跟踪
检查点:在任何改变sigmask位图之后,调用sigreturn之后
捕获信号:做进一步的信号处理,重新设置栈的内容
Catch位图被置位
3、捕获信号
将sigaction中的各种信息和sigreturn函数的地址传递给内核。内核去重新设置栈和寄存器内容,让进程再次运行时执行信号处理函数,并且信号处理函数执行完成之后执行sigreturn,进程返回到信号处理函数执行的状态

信号相关调用
Sigaction调用:改变进程的某一个信号操作,或是获取进程的某一个操作
根据一个进程的进程描述符中的指针,找到代表目的进程该信号操作的sigaction结构。直接返回或是替换

Sigprocmask调用:改变进程的屏蔽信号
对进程描述符上代表屏蔽信号的sigmask位图进行替换,替换完成之后要检查,看是否有非屏蔽的挂起信号
Kill调用:向另一个进程发送信号
完整执行上述信号处理流程
Sigsuspend调用:悬挂进程,等待某些信号唤醒
将进程原屏蔽位图sigmask保存到sigmask2,将sigmask置为我们在挂起时需要屏蔽的信号位图,然后暂停。同意,再改变了屏蔽信号的位图之后需要检查,看是否有非屏蔽的挂起信号

Sigpending调用:得到进程当前屏蔽的信号
返回当前进程的sigmask位图
Sigreturn调用:在信号处理后恢复进程状态到信号处理之前
struct sigaction
{
handler_t sa_handler;//信号处理函数指针
sigset_t sa_mask;//信号处理函数运行时需要屏蔽的信号
int sa_flags;//怎样处理信号的一个标志集
};
mproc{
...
sigset_t mp_ignore; /* 1 means ignore the signal, 0 means don't*/
sigset_t mp_catch; /* 1 means catch the signal, 0 means don't */
sigset_t mp_sigmask; /* signals to be blocked */
sigset_t mp_sigmask2; /* saved copy of mp_sigmask */
sigset_t mp_sigpending; /* pending signals to be handled */
sigset_t mp_ksigpending; /* bitmap for pending signals from the kernel */
sigset_t mp_sigtrace; /* signals to hand to tracer first */
ixfer_sigaction *mp_sigact; /* as in sigaction(2), pointer into mpsigact */
vir_bytes mp_sigreturn; /* address of C library __sigreturn function */
unsigned mp_flags; /* flag bits */
...
}
Minix3信号处理分析的更多相关文章
- MINIX3 进程调度分析
MINIX3 进程调度分析 5.1MINIX3 进程调度概要 MINIX3 的进程调度还是非常简单的,调度算法是非常短小的,其目的就是体现 了一个简单和高效的设计原则,当然简单和高效其实很难并存, ...
- MINIX3 导读分析
一个操作系统的分析是属于一个非常庞大的工程,操作系统就像是一个人造的 人,每一个模块想完全发挥功效,很有可能需要很多模块的支持才能够实现.所 以在分析 MINIX3 时,我认为同时看多个模块对于理解 ...
- KCF:High-Speed Tracking with Kernelized Correlation Filters 的翻译与分析(一)。分享与转发请注明出处-作者:行于此路
High-Speed Tracking with Kernelized Correlation Filters 的翻译与分析 基于核相关滤波器的高速目标跟踪方法,简称KCF 写在前面,之所以对这篇文章 ...
- PM 时钟机制
PM 时钟机制 10.1 Minix3 PM 时钟机制概述在 MINIX3 中,除了前面所讲到的 CLOCK 时钟,在 pm 中也是维持了一个时钟, 我们暂且不分析为啥要这么做,我就分析是怎么实现这个 ...
- Tinyshell: 一个简易的shell命令解释器
这是自己最近学习Linux系统编程之后写的一个练手的小程序,能很好地复习系统编程中的进程管理.信号.管道.文件等内容. 通过回顾写的过程中遇到的问题的形式记录程序的关键点,最后给出完整程序代码. 0. ...
- MINIX3 内核整体架构回顾及内核定 性分析
MINIX3 内核整体架构回顾及内核定 性分析 12.1 注意事项 由于本文档不对 I/O 文件系统做出分析,所以在此不对 MINIX3 整体做出一个分 析,本章主要是针对内核进程分析.并且这里的模 ...
- MINIX3 进程通信分析
MINIX3 进程通信分析 6.1MINIX3 进程通信概要 MINIX3 的进程通信是 MINIX3 内核部分最重要的一个部件,我个人认为其实这 是内核中的“内核”,怎么来理解这个概念呢?其实 MI ...
- MINIX3 内核时钟分析
MINIX3 内核时钟分析 4.1 内核时钟概要 先想想为什么 OS 需要时钟?时钟是异步的一个非常重要的标志,设想一下,如 果我们的应用程序需要在多少秒后将触发某个程序或者进程,我们该怎么做到? ...
- libevent源码分析之信号处理
新看看官方demo的libevent如何使用信号 int called = 0; static void signal_cb(int fd, short event, void *arg) { str ...
随机推荐
- Vue路由vue-router
前面的话 在Web开发中,路由是指根据URL分配到对应的处理程序.对于大多数单页面应用,都推荐使用官方支持的vue-router.Vue-router通过管理URL,实现URL和组件的对应,以及通过U ...
- 混合高斯模型(Mixtures of Gaussians)和EM算法
这篇讨论使用期望最大化算法(Expectation-Maximization)来进行密度估计(density estimation). 与k-means一样,给定的训练样本是,我们将隐含类别标签用表示 ...
- MySQL之多表操作
前言:之前已经针对数据库的单表查询进行了详细的介绍:MySQL之增删改查,然而实际开发中业务逻辑较为复杂,需要对多张表进行操作,现在对多表操作进行介绍. 前提:为方便后面的操作,我们首先创建一个数据库 ...
- Java历程-初学篇 Day02变量,数据类型和运算符
一,数据类型 1,基础数据类型 整型 byte short int long 浮点型 float double 字符型 char 布尔类型 boolean 2,引用类型 String 字符串型 二,变 ...
- ConvertUtils.register注册转换器
当用到BeanUtils的populate.copyProperties方法或者getProperty,setProperty方法其实都会调用convert进行转换 但Converter只支持一些基本 ...
- AJAX学习前奏----JS基础加强
AJAX学习前奏----JS基础加强 知识概要: 1.js类&属性&方法的定义 2.静态属性与方法 3.构造方法 4.原型的使用 5.Object对象直接加属性和方法 6.JSO ...
- 学习总结---SNAT和DNAT
1.SNAT是结合源ip+源端口号变化的NAT功能. DNAT是将目的ip直接转换成私有的目的ip.(是否转换目的端口号?) 2.SNAT的应用场景:公司内部访问互联网时,使用公共的公网ip.从内到外 ...
- Javascript 面向对象编程—封装
前 言 Javascript是一种基于对象(object-based)的语言,你遇到的所有东西几乎都是对象.但是,它又不是一种真正的面向对象编程(OOP)语言,因为它的语法中没有class(类) ...
- [解读REST] 1.REST的起源
0. 世界上第一个网站 1990年12月20日,这一天对于现在的互联网来说意义非凡.欧洲核子研究组织(CREN)的科学家Tim Berners-Lee在一台NeXT电脑上启动了世界上的第一个网站(当然 ...
- vmware虚拟机安装CentOS-6.5教程
linux是企业最常用的服务器系统之一,CentOS是免费的,所以用的企业也挺多,今天给大家分享怎么在自己电脑的虚拟机中安装CentOS-6.5,以便用来玩耍,没事的时候可以学学linux的一些知识. ...