进程的信号处理的相关结构

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信号处理分析的更多相关文章

  1. MINIX3 进程调度分析

    MINIX3 进程调度分析  5.1MINIX3 进程调度概要  MINIX3 的进程调度还是非常简单的,调度算法是非常短小的,其目的就是体现 了一个简单和高效的设计原则,当然简单和高效其实很难并存, ...

  2. MINIX3 导读分析

    一个操作系统的分析是属于一个非常庞大的工程,操作系统就像是一个人造的 人,每一个模块想完全发挥功效,很有可能需要很多模块的支持才能够实现.所 以在分析 MINIX3 时,我认为同时看多个模块对于理解 ...

  3. KCF:High-Speed Tracking with Kernelized Correlation Filters 的翻译与分析(一)。分享与转发请注明出处-作者:行于此路

    High-Speed Tracking with Kernelized Correlation Filters 的翻译与分析 基于核相关滤波器的高速目标跟踪方法,简称KCF 写在前面,之所以对这篇文章 ...

  4. PM 时钟机制

    PM 时钟机制 10.1 Minix3 PM 时钟机制概述在 MINIX3 中,除了前面所讲到的 CLOCK 时钟,在 pm 中也是维持了一个时钟, 我们暂且不分析为啥要这么做,我就分析是怎么实现这个 ...

  5. Tinyshell: 一个简易的shell命令解释器

    这是自己最近学习Linux系统编程之后写的一个练手的小程序,能很好地复习系统编程中的进程管理.信号.管道.文件等内容. 通过回顾写的过程中遇到的问题的形式记录程序的关键点,最后给出完整程序代码. 0. ...

  6. MINIX3 内核整体架构回顾及内核定 性分析

    MINIX3  内核整体架构回顾及内核定 性分析 12.1 注意事项 由于本文档不对 I/O 文件系统做出分析,所以在此不对 MINIX3 整体做出一个分 析,本章主要是针对内核进程分析.并且这里的模 ...

  7. MINIX3 进程通信分析

    MINIX3 进程通信分析 6.1MINIX3 进程通信概要 MINIX3 的进程通信是 MINIX3 内核部分最重要的一个部件,我个人认为其实这 是内核中的“内核”,怎么来理解这个概念呢?其实 MI ...

  8. MINIX3 内核时钟分析

    MINIX3 内核时钟分析  4.1 内核时钟概要  先想想为什么 OS 需要时钟?时钟是异步的一个非常重要的标志,设想一下,如 果我们的应用程序需要在多少秒后将触发某个程序或者进程,我们该怎么做到? ...

  9. libevent源码分析之信号处理

    新看看官方demo的libevent如何使用信号 int called = 0; static void signal_cb(int fd, short event, void *arg) { str ...

随机推荐

  1. ESLint可共享配置发布,团队自定义ESLint规则新鲜出炉

    ESLint于2013年6月份推出,至今4个年头,最新版本v4.8.0.它是目前主流的用于Javascript和JSX代码规范检查的利器,很多大公司比如Airbnb和Google均有一套自己的Java ...

  2. C#.net干货,最全公共帮助类

    比较全面的c#帮助类,日常工作收集,包括前面几家公司用到的,各式各样的几乎都能找到,所有功能性代码都是独立的类,类与类之间没有联系,可以单独引用至项目,分享出来,方便大家,几乎都有注释,喜欢的请点赞, ...

  3. python之HTMLParser解析HTML文档

    HTMLParser是Python自带的模块,使用简单,能够很容易的实现HTML文件的分析.本文主要简单讲一下HTMLParser的用法. 使用时需要定义一个从类HTMLParser继承的类,重定义函 ...

  4. 【特效】hover图片立体翻转

    hover图片翻转效果二::绕Y轴旋转90度,注意父层要加透视属性perspective,这样才能看出立体效果 html: <ul class="list-img"> ...

  5. OpenSCAD 建模:矿泉水瓶花洒

    下载地址:https://github.com/ZhangGaoxing/openscad-models/tree/master/Sprinkle 代码: module screw(r=){ ::]) ...

  6. IIC协议简介(笔记图片)

  7. JDBC工具类实例

    本文以讲解用单利模式实现一个简单的JDBC实用工具类JDBC连接的四个基本步骤:1.加载相应数据库驱动2.建立相应数据库连接3.构建Statement语句,即增删改查SQL语句4.执行Statemen ...

  8. C# WinForm DataGridView让DataPropertyName支持复杂属性

    首先给Grid添加BindingSource,类型为BindingForForm2.或者设置Grid的DataSource为IEnumerable<BindingForForm2>. Bi ...

  9. (MariaDB)MySQL数据类型详解和存储机制

    html { font-family: sans-serif } body { margin: 0 } article,aside,details,figcaption,figure,footer,h ...

  10. 【ASP.NET MVC 学习笔记】- 06 在MVC中使用Ninject

    本文参考:http://www.cnblogs.com/willick/p/3299077.html 1.在ASP.NET MVC中一个客户端请求是在特定的Controller的Action中处理的. ...