当前位置: 首页 > news >正文

【linux学习指南】linux捕捉信号

请添加图片描述

文章目录

  • 📝前言
  • 🌠 信号捕捉的流程
    • 🌉 sigaction
  • 🌠穿插话题-操作系统是怎么运⾏的
    • 🌉 硬件中断
    • 🌉时钟中断
  • 🚩总结


📝前言

在这里插入图片描述

🌠 信号捕捉的流程

在这里插入图片描述

如果信号的处理动作是⽤⼾⾃定义函数,在信号递达时就调⽤这个函数,这称为捕捉信号。
由于信号处理函数的代码是在⽤⼾空间的,处理过程⽐较复杂,举例如下:

  • ⽤⼾程序注册了SIGQUIT 信号的处理函数sighandler
  • 当前正在执⾏main 函数,这时发⽣中断或异常切换到内核态。
  • 在中断处理完毕后要返回⽤⼾态的main 函数之前检查到有信号SIGQUIT 递达。
  • 内核决定返回用户态后不是恢复main函数的上下文继续执行,而是执行sighandler函数, sighandler和main函数使用不同的堆栈空间,它们之间不存在调用和被调用的关系,是两个独立的控制流程。
  • sighandler函数返回后自动执行特殊的系统调用sigreturn再次进入内核态。
  • 如果没有新的信号要递达,这次再返回用户态就是恢复main函数的上下文继续执行了。

在这里插入图片描述

🌉 sigaction

SYNOPSIS#include <signal.h>int sigaction(int signum, const struct sigaction *act,struct sigaction *oldact);
  • sigaction函数可以读取和修改与指定信号相关联的处理动作。调⽤成功则返回0,出错则返回-1。signo是指定信号的编号。若act指针⾮空,则根据act修改该信号的处理动作。若oact指针⾮空,则通过oact传出该信号原来的处理动作。act和oact指sigaction结构体:

  • 将sa_handler赋值为常数SIG_IGN传给sigaction表⽰忽略信号,赋值为常数SIG_DFL表⽰执⾏系统默认动作,赋值为⼀个函数指针表⽰⽤⾃定义函数捕捉信号,或者说向内核注册了⼀个信号处理函数,该函数返回值为void,可以带⼀个int参数,通过参数可以得知当前信号的编号,这样就可以⽤同⼀个函数处理多种信号。显然,这也是⼀个回调函数,不是被main函数调⽤,⽽是被系统所调⽤。

当某个信号的处理函数被调⽤时,内核⾃动将当前信号加⼊进程的信号屏蔽字,当信号处理函数返回时⾃动恢复原来的信号屏蔽字,这样就保证了在处理某个信号时,如果这种信号再次产⽣,那么它会被阻塞到当前处理结束为⽌。如果在调⽤信号处理函数时,除了当前信号被⾃动屏蔽之外,还希望⾃动屏蔽另外⼀些信号,则⽤sa_mask字段说明这些需要额外屏蔽的信号,当信号处理函数返回时⾃动恢复原来的信号屏蔽字。sa_flags字段包含⼀些选项,本章的代码都把sa_flags设为0,sa_sigaction是实时信号的处理函数,本章不详细解释这两个字段,有兴趣的同学可以在了解⼀下。

🌠穿插话题-操作系统是怎么运⾏的

🌉 硬件中断

在这里插入图片描述

  • 中断向量表就是操作系统的⼀部分,启动就加载到内存中了
  • 通过外部硬件中断,操作系统就不需要对外设进⾏任何周期性的检测或者轮询
  • 由外部设备触发的,中断系统运⾏流程,叫做硬件中断
// Linux
内核
0.11 源码voidtrap_init(void)
{int i;set_trap_gate(0, &divide_error); // 设置除操作出错的中断向量值。以下雷同。set_trap_gate(1, &debug);set_trap_gate(2, &nmi);set_system_gate(3, &int3); /* int3-5 can be called from all */set_system_gate(4, &overflow);set_system_gate(5, &bounds);set_trap_gate(6, &invalid_op);set_trap_gate(7, &device_not_available);set_trap_gate(8, &double_fault);set_trap_gate(9, &coprocessor_segment_overrun);set_trap_gate(10, &invalid_TSS);set_trap_gate(11, &segment_not_present);set_trap_gate(12, &stack_segment);set_trap_gate(13, &general_protection);set_trap_gate(14, &page_fault);set_trap_gate(15, &reserved);set_trap_gate(16, &coprocessor_error);// 下面将int17-48的陷阱门先均设置为reserved,以后每个硬件初始化时会重新设置自己的陷阱门ofor (i = 17; i < 48; i++)set_trap_gate(i, &reserved);set_trap_gate(45, &irq13); // 设置协处理器的陷阱⻔。outb_p(inb_p(0x21) & 0xfb, 0x21);       // 允许主8259A 芯⽚的IRQ2 中断请求。outb(inb_p(0xA1) & 0xdf, 0xA1);         // 允许从8259A 芯⽚的IRQ13 中断请求。set_trap_gate(39, &parallel_interrupt); // 设置并⾏⼝的陷阱⻔。
}void rs_init(void)
{set_intr_gate(0x24,rs1_interrupt); // 设置串行口1的中断门向量(硬件IRQ4信号)。set_intr_gate(0x23,rs2_interrupt); // 设置串行口2的中断门向量(硬件IRQ3信号)。init(tty_table[1].read_q.data);// 初始化串行口1( .data是端口号)。init(tty_table[2].read_q.data);// 初始化串行口2。outb(inb_p(0x21) & 0xE70x21); // 允许主8259A 芯片的IRQ3,IRQ4中断信号请求。
}

🌉时钟中断

问题:
进程可以在操作系统的指挥下,被调度,被执⾏,那么操作系统⾃⼰被谁指挥,被谁推动执⾏呢?

外部设备可以触发硬件中断,但是这个是需要⽤⼾或者设备⾃⼰触发,有没有⾃⼰可以定期触发的
设备?
在这里插入图片描述

这样,操作系统不就在硬件的推动下,⾃动调度了么!!!

// 调度程序的初始化子程序。
void sched_init(void)
{... set_intr_gate(0x20, & timer_interrupt);// 修改中断控制器屏蔽码,允许时钟中断。outb(inb_p(0x21) & ~0x01,0x21);// 设置系统调用中断门。set_system_gate(0×80, & system_call);...
}
// system_call.s
_timer_interrupt : ...;
// do_timer(CPL)执行任务切换、计时等工作,在kernel/shched.c,305行实现。
call _do_timer; // 'do_timer(long CPL )' does everything from// 调度入口
void do_timer(long cpl)
{...;schedule();
}
void schedule(void)
{switch_to(next); // 切换到任务号为next的任务,并运行之。
}

🚩总结

请添加图片描述

相关文章:

【linux学习指南】linux捕捉信号

文章目录 &#x1f4dd;前言&#x1f320; 信号捕捉的流程&#x1f309; sigaction &#x1f320;穿插话题-操作系统是怎么运⾏的&#x1f309; 硬件中断&#x1f309;时钟中断 &#x1f6a9;总结 &#x1f4dd;前言 &#x1f320; 信号捕捉的流程 如果信号的处理动作是⽤⼾⾃定…...

git如何快速拉取已经提交的mr进行验证

参考&#xff1a;https://stackoverflow.com/questions/44992512/how-to-checkout-merge-request-locally-and-create-new-local-branch Pull merge request to new branch git fetch origin merge-requests/REQUESTID/head:BRANCHNAME i.e git fetch origin merge-requests/…...

【阿来来gis规划师工具箱说明书】h07四分标注

背景 在做arcmap的四分标注前&#xff0c;已经做好了二行三行的标注&#xff0c;以及在pro中做好了四分标注。这个四分标注做了好些版本&#xff0c;都达不到想要的效果。最终使用了静态标注的形式来做。 制作思路 新建两个承接标注文字的文本字段&#xff0c;考虑一般标注超…...

【大数据学习 | 面经】HDFS的三副本机制和编码机制

1. hdfs的三副本机制 hdfs的三副本机制是其核心特性之一&#xff0c;旨在确保数据的高可用性和容错性。通过将每个文件的数据块复制三个副本&#xff0c;并分散存储在不同的DateNode上&#xff0c;hdfs能够在节点故障的时候提供数据冗余和持续访问的能力。 三副本机制的工作原…...

lua-cjson 例子

apt install -y lua-cjson 安装 编辑 tmp.lua cjson require "cjson" p 666 d "23.42" payload{"d":[{"pres":..(p)..,"temp":"..(d).."}]} print("payload " .. payload) j cjson.decode(payloa…...

java面向对象知识点: 封装,构造,重载

目录 封装 封装知识点 private&#xff08;私有&#xff09; public&#xff08;公共&#xff09; 二、getter和setter方法 getter方法&#xff08;访问器方法&#xff09; setter方法&#xff08;修改器方法&#xff09; 三、封装类的设计原则 单一职责原则 高内聚性 一…...

go的math/rand随机数生成器

伪随机数生成器&#xff0c;默认情况下随机数种子是固定的&#xff0c; **注意&#xff1a;**固定的随机数种子每次生成的随机数都是相同的随机数序列 一、基础用法 math/rand 包提供了随机数生成的方法。常用的函数包括&#xff1a; rand.Int()&#xff1a;返回一个伪随机…...

JiaJia-CP-1,2,3的WP(2)

一.JiaJia-CP-2 一看题目&#xff0c;聊天软件&#xff0c;用的什么聊天软件直接userassist看运行过什么程序 vol -f JiaJia_Co.raw --profileWin7SP1x64 userassist 发现Telegram.exe(小飞机) 可能性很大啊(真是个摸鱼大神) 除此之外&#xff0c;filescan也能看到&#xff0…...

3DMAX星空图像生成器插件使用方法详解

3DMAX星空图像生成器插件&#xff0c;一键生成星空或夜空的二维图像。它可用于创建天空盒子或空间场景&#xff0c;或作为2D艺术的天空背景。 【主要特点】 -单击即可创建星空图像或夜空。 -星数、亮度、大小、形状等参数。 -支持任何图像大小&#xff08;方形&#xff09;。…...

ROS2 系列学习教程(总目录)

ROS2Learning ROS1 系列学习教程(总目录) 一、ROS2 简介 1.1 ROS2简介及学习资源汇总 二、ROS2 基础 2.1 ROS2安装详细教程&#xff08;以Humble为例&#xff09; 2.2 ROS2 构建系统 colcon 介绍、安装与使用 2.3 ROS2 与 ROS1 编码方式对比 ROS2 与 ROS1 编码方式对比&am…...

[GKCTF 2021]签到

[GKCTF 2021]签到 wireshark跟踪http流&#xff0c;基本编解码&#xff0c;倒叙&#xff0c;栅栏密码 找到cat /f14g 把包里返回的字符串先hex解码&#xff0c;再base64解码&#xff0c;看到一个时间是倒叙&#xff0c;不含flag 继续往下面翻&#xff0c;可以看到cat%2Ff14g%7…...

Kubernetes——part11 云原生中间件上云部署 Rocketmqkafkazookeeper

Rocketmq rocketmq角色 RocketMQ由四部分构成&#xff1a;Producer、Consumer、Broker和NameServer 启动顺序&#xff1a;NameServer->Broker 为了消除单点故障&#xff0c;增加可靠性或增大吞吐量&#xff0c;可以在多台机器上部署多个nameserver和broker&#xff0c;并…...

ip租期到了

当IP租约到期后&#xff0c;会发生以下过程&#xff1a; 租约到期通知&#xff1a;在租约到期之前&#xff0c;DHCP客户端通常会尝试续租其IP地址。如果客户端仍然活跃并且希望继续使用相同的IP地址&#xff0c;它会向DHCP服务器发送一个DHCP请求&#xff08;DHCPREQUEST&#…...

鸿蒙系统(harmony)支持Android应用的双框架技术架构分析

鸿蒙系统(HarmonyOS)支持 Android 应用的双框架技术架构 是为了在鸿蒙操作系统上实现对 Android 应用的兼容与支持,特别是在多设备生态下,确保不同类型的 Android 应用能够无缝运行在鸿蒙设备上。这种双框架架构使鸿蒙能够兼顾自身的原生应用生态和 Android 的广泛应用生态…...

面积等效原理

面积等效原理 电力电子技术中的面积等效原理主要应用在PWM&#xff08;Pulse Width Modulation&#xff0c;脉冲宽度调制&#xff09;控制技术中。 定义 面积等效原理&#xff1a;当冲量&#xff08;即窄脉冲的面积&#xff09;相等而形状不同的窄脉冲加在具有惯性的环节上时…...

【测试工具JMeter篇】JMeter性能测试入门级教程(四):JMeter中BeanShell内置方法使用

一、什么是BeanShell BeanShell是一种完全符合Java语法规范的脚本语言,并且又拥有自己的一些语法和方法;BeanShell是一种松散类型的脚本语言(这点和JS类似);BeanShell是用Java写成的,一个小型的、免费的、可以下载的、嵌入式的Java源代码解释器,具有对象脚本语言特性,非常精简…...

大小写转换

描述 将下面的字符串中的大小写进行转换。 输入描述 输入一行仅包含字母的字符串(字符串长度 ≤100)。 输出描述 将其中的大写转换为小写&#xff0c;小写转换为大写。 abcD ABCd #include<iostream> #include<string> using namespace std; int main() { …...

手机镜头组如此突出,考虑恢复以前设计

现在手头看重照相。结果导致的问题就是&#xff0c;在背部要突出很高&#xff0c;以容纳镜头组件。这种设计真的好吗&#xff1f;并不见得。真实照片&#xff1a; VIVO X200系列镜头组照片-CSDN博客 考虑到现在镜头的情形&#xff0c;我建议恢复以前的设计&#xff0c;就是把镜…...

浅谈人工智能之基于容器云进行图生视频大模型搭建

浅谈人工智能之基于容器云进行图生视频大模型搭建 根据之前我们所讲过的内容&#xff1a; 文生图 文生视频 我们继续讲解图生视频大模型搭建。 引言 随着深度学习技术的不断发展&#xff0c;图生视频&#xff08;image-to-video&#xff09;大模型成为了计算机视觉和自然语言…...

大型复杂项目管理怎么结合传统与敏捷

大型复杂项目管理需要综合运用传统的瀑布模型与敏捷方法&#xff0c;两者各具优势&#xff0c;可以在不同的项目阶段和需求下发挥最大效能。首先&#xff0c;在项目的初期阶段&#xff0c;传统方法的详细规划和需求分析能够帮助确保项目方向正确、资源充足&#xff1b;敏捷方法…...

家校通小程序实战教程04教师管理

目录 1 创建数据源2 搭建管理后台3 搭建查询条件4 功能测试总结 我们上一篇介绍了如何将学生加入班级&#xff0c;学生加入之后就需要教师加入了。教师分为任课老师和班主任&#xff0c;班主任相当于一个班级的管理员&#xff0c;日常可以发布各种任务&#xff0c;发布接龙&…...

UI控件使用说明

文章目录 一、控件的公共属性二、常用控件的私有属性三、控件的显示与隐藏 一、控件的公共属性 struct element {u32 highlight: 1; //高亮标志u32 state: 3; //内核记录控件的状态u32 ref: 5; //内核计数值u32 prj: 3; //工程序号u32 hide_action: 1; //HIDE_WI…...

树莓派2安装jupyterlab以便更好的编程体验

树莓派2 是一款很老的开发板了&#xff0c;但是它还能继续战斗。为了更好的编程体验&#xff0c;准备安装jupyterlab 安装jupyterlab 使用命令&#xff1a; pip install jupyterlab 该过程非常漫长&#xff0c;因为树莓派2是很老的板子&#xff0c;它需要安装一些arm7版本的…...

计算机网络常见面试题总结(上)

计算机网络基础 网络分层模型 OSI 七层模型是什么&#xff1f;每一层的作用是什么&#xff1f; OSI 七层模型 是国际标准化组织提出的一个网络分层模型&#xff0c;其大体结构以及每一层提供的功能如下图所示&#xff1a; 每一层都专注做一件事情&#xff0c;并且每一层都需…...

k8s 亲和性之Affinity

文章目录 1. Node Affinity&#xff08;节点亲和性&#xff09;节点亲和性类型配置示例常见场景&#xff1a; 2. Pod Affinity 和 Pod Anti-AffinityPod Affinity 配置示例Pod Anti-Affinity 配置示例常见场景&#xff1a; 3. 亲和性规则概述4. 亲和性和反亲和性的细节5. 亲和性…...

SpringBoot 插件化开发模式

一、前言 1.1 使用插件的好处 1.1.1 模块解耦 实现服务模块之间解耦的方式有很多&#xff0c;但是插件来说&#xff0c;其解耦的程度似乎更高&#xff0c;而且更灵活&#xff0c;可定制化、个性化更好。 举例来说&#xff0c;代码中可以使用设计模式来选择使用哪种方式发送…...

基于树莓派的安保巡逻机器人--项目介绍

目录 一、项目简介 二、项目背景 三、作品研发技术方案 作品主要内容&#xff1a; 方案的科学性 设计的合理性 四、作品创新性及特点 五、作品自我评价 本篇为项目“基于树莓派的安保巡逻机器人”介绍博客 演示视频链接&#xff1a; 基于树莓派的安保巡逻机器人_音游…...

Python学习笔记8-函数1

自定义函数 def 函数名(形参):函数体return 空/变量/对象/表达式 形参&#xff1a;函数定义时声明的参数实参&#xff1a;函数调用时传入的参数。函数只需要定义一次&#xff0c;就可以被多次使用当函数被调用时&#xff0c;才执行函数体&#xff0c;定义时不执行 文档注释 …...

如何使用ST7789展现图片?[ESP--4]

本节我们继续ESP和ST 7789的话题&#xff0c;这节课我们来学学如何展示图片,话不多说&#xff0c;先上效果 好&#xff0c;教程开始~前情提要&#xff0c;要看懂这篇&#xff0c;建议搭配楼主的前两期文章 使用ESP32驱动LCD-ST7789屏幕[ESP–2] 加速你的LCD-ST7789屏幕&#xf…...

【QNX+Android虚拟化方案】129 - USB眼图参数配置

【QNX+Android虚拟化方案】129 - USB眼图参数配置 1. 软件侧dts如何配置眼图参数 及 其对应关系2. 硬件 QNX 侧调试眼图命令2.1 High Speed USB2.0 Host2.2 Super Speed USB3.0 Host3. 硬件 Android 侧调试眼图命令基于原生纯净代码,自学总结 纯技术分享,不会也不敢涉项目、不…...

宣化网站建设/山东免费网络推广工具

2019独角兽企业重金招聘Python工程师标准>>> ANT通配符有三种&#xff1a; 通配符说明?匹配任何单字符*匹配0或者任意数量的字符**匹配0或者更多的目录例子&#xff1a; URL路径说明/app/*.x匹配(Matches)所有在app路径下的.x文件/app/p?ttern匹配(Matches) /app/…...

域名备案要先做网站的吗/合肥做网站推广

笔者原以为是个挺容易个事儿, 毕竟是微软自家的产品安装在自家的操作系统上, 没想到还是让我费了半天劲. 写在这里吧, 方便其他的朋友. 具体步骤 1. 准备好Windows Server 2012 R2 RTM的一台虚拟机, 准备SharePoint 2013 RTM的安装包, 和SP1的安装包. 2. 制作slipstream安装文…...

建筑工程网课文案/友链对网站seo有帮助吗

leetcode第275次周赛ac代码 第一题&#xff1a; 思路分析: ​ 按照行遍历一次&#xff0c;在按照列遍历一次&#xff0c;如果发现了不符合条件的值&#xff0c;直接返回false&#xff0c;已经走过的数字&#xff0c;可以保存在map里面 &#xff0c;其实也可以保存在boolean…...

做网站和做系统有什么区别/外贸接单网站

Redis 持久化: 提供了多种不同级别的持久化方式:一种是RDB,另一种是AOF. RDB 持久化可以在指定的时间间隔内生成数据集的时间点快照&#xff08;point-in-time snapshot&#xff09;。 AOF 持久化记录服务器执行的所有写操作命令&#xff0c;并在服务器启动时&#xff0c;通过重…...

wordpress教程之/网站关键词排名seo

来源&#xff5c;脑极体编辑&#xff5c;海怪今年春节&#xff0c;很多人无法回家。一个就地过年的春节&#xff0c;让无法归乡的人们多了一丝难以排解的乡愁&#xff0c;也多了很多自由自在的时间。趁着闲暇&#xff0c;不如搞点有趣的事情&#xff0c;比如去开发宇宙。最近&a…...

struts2 做的网站/站长工具 seo综合查询

题目 有n(1<n<1e5)个数&#xff0c;第i个数为ui(1<ui<1e5) 对于其前缀i个数&#xff0c;必须删去一个数&#xff0c;使得对于剩下的数中&#xff0c;每种数字出现的次数相同 最大化符合条件的i&#xff0c;输出这个i 思路来源 官方题解 题解 记cnt[x]为出现…...