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

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. 无向图广度优先遍历及其matlab实现

    广度优先遍历(breadth-first traverse,bfts),称作广度优先搜索(breath first search)是连通图的一种遍历策略.之所以称作广度优先遍历是因为他的思想是从一个顶 ...

  2. Scala 运算符和集合转换操作示例

    Scala是数据挖掘算法领域最有力的编程语言之一,语言本身是面向函数,这也符合了数据挖掘算法的常用场景:在原始数据集上应用一系列的变换,语言本身也对集合操作提供了众多强大的函数,本文将以List类型为 ...

  3. 填个小坑,Vue不支持IE8及以下,跨域ajax不支持IE9

    这特么就尴尬了,说好的Vue支持IE8及以下的呢,引入jquery,测试IE个浏览器,IE9仍然显示不正常, 然而命令行测试Vue仍然存在, 数据回不来!数据回不来!数据回不来! 好吧  肉包子打狗$ ...

  4. Django安装以及介绍

    安装django说先需要安装python环境,因为他是依赖于python环境运行的 最好再安装pycharm,一款强大的开发工具,里面有各种开发工具的集成 在Windows先安装: 首先进入cmd命令 ...

  5. .NET下发送邮件遇到问题及解决方案

    .NET后台代码利用QQ邮箱服务器发送邮件遇到的问题: "mail from address must be same as authorization user" 首先,看下我的 ...

  6. JavaFX引入资源问题

    描述 - 使用javafx 引入资源的时候 抛出异常 在swing引入资源 采取相对路径即可,而javafx不是 ImageView imageNode = (ImageView) root.look ...

  7. Linux入门(14)——Ubuntu常用快捷键

    打开终端:ctrl + alt + T 左右分屏:ctrl + win + 箭头左或者箭头右 显示桌面:Ctrl + win + D 切换工作区:ctrl + alt + 箭头左或者箭头右 新建文件夹 ...

  8. Node.js之异步流控制

    前言 在没有深度使用函数回调的经验的时候,去看这些内容还是有一点吃力的.由于Node.js独特的异步特性,才出现了"回调地狱"的问题,这篇文章中,我比较详细的记录了如何解决异步流问 ...

  9. 在centos6上实现LAMP的FPM模式

    原理 http使用一次编译法编译安装,php独立服务fpm实现. 软件版本 在本次实验中,我们需要用到的软件版本如下: apr-1.6.2 apr-util-1.6.0 httpd-2.4.28 ma ...

  10. C 其他一些

    1.联合,语法 union{成员1;成员2;} 联合间的成员共享同一个空间,也就是说,成员1赋值如果没有被清除,会体现在成员2上 2.位字段,结合结构体瓜分完整的类型存储空间,如 struct{ ; ...