【Linux课程学习】:第二十一弹---深入理解信号(中断,信号,kill,abort,raise,larm函数)

🎁个人主页:我们的五年

🔍系列专栏:Linux课程学习 

🌷追光的人,终会万丈光芒

🎉欢迎大家点赞👍评论📝收藏⭐文章

Linux学习笔记:
 https://blog.csdn.net/djdjiejsn/category_12669243.html

前言:

本篇是对上一篇信号的基础部分再一次讲解,对信号的有一个更深入的理解。相信看完下面的部分,我们能更清楚的认识到信号的本质。

目录

一.理解OS如何得键盘有数据

1.1硬件中断的定义:

1.2理解硬件中断和软件信号:

1.3阐述中断到CPU拿到数据的全过程:

 二.通过系统命令向进程发信号:

2.1系统命令发生信号的方法:

2.系统命令的预想:

 2.3结构分析:

 三.给后台进程发送终止信号的以后,为什么回车才能显示退出信息?

四.使用函数产生信号

🥪kill函数:

1.函数原型:

2.函数解析:

3.函数实践

🥪 raise函数和abort函数:

1.raise函数:

2.abort函数:

五.由软件条件产生信号

5.1alarm函数介绍:

5.2函数使用:

​编辑

5.3理解软件条件产生信号:

5.4OS如何管理信号:

六.硬件条件产生信号:

七.本篇总结:


一.理解OS如何得键盘有数据

信号
中断

1.1硬件中断的定义:

硬件中断是由与系统相连的外设(如磁盘、网卡、键盘、时钟等)自动产生的异步信号。这些外设通过总线将中断信号发送给中断控制器,再由中断控制器转发给CPU。每个设备或设备集都有自己的中断请求(IRQ)号,基于这个IRQ号,CPU可以将相应的请求分发到对应的硬件驱动上

每一个硬件都有自己的中断请求号(IRQ),所以以后的中断就能区分是哪个硬件发来的,就可以让CPU去哪个硬件读取数据。

中断确实是通过电路给CPU发信号的。

1.2理解硬件中断和软件信号:

1.信号其实是在模拟硬件中断的行为,只是信号是软件层面的,中断是硬件层面的。

2.中断是通过电路进行发生的,是发给CPU的,而信号是发给进程的。

3.两者有相似性,但是层级不同。

1.3阐述中断到CPU拿到数据的全过程:

当我们键盘按下以后,键盘通过电路(高电压)向CPU的针脚发送中断信息,CPU执行操作系统保存当前进程的代码和数据,然后操作系统停下来去读取外设的内存。


 二.通过系统命令向进程发信号:

2.1系统命令发生信号的方法:

通过kill -(信号编号)(进程pid):对进程发送信号

通过上面的方法就能给指定的进程发送指定的信号,下面的代码我们可以给指定的信号。

2.系统命令的预想:

我们可以让一个进程死循环,然后启动另外一个shell对该进程发送一系列的信号。或者我们可以通过对某个信号进程捕捉,然后给进程发该信号,然后去执行我们的自定义行为。有很多的中断进程的信号,我们还可以去发送其他的信号观察进程的反应情况。

#include <iostream>
#include <unistd.h>
#include <signal.h>void handle(int signo)
{std::cout << "signo:" << signo << "系统命令" << std::endl;
}int main()
{//自定义SIGINT-2号信号的行为,让二号信号不再执行终止进程的操作::signal(SIGINT, handle);while (true){std::cout << "pid:" << getpid() << std::endl;sleep(1);}return 0;
}

 2.3结构分析:

因为是前台进程,我们只能通过另外一个shell对死循环的进程发送2号信号,3号信号。发送2号信号,打印2号信号的数字2,还有系统命令。


 三.给后台进程发送终止信号的以后,为什么回车才能显示退出信息?

shell的设计理念是不希望用户的输入信息和出错的信息交错在一起。

所以为什么要按一次回车才能显示退出的信息是因为:

是因为进程在退出之前就来到了shell命令行提示符,等待用户输入,此时shell不希望和输入交错,所以按回车以后才能打印退出的信息。

在Shell中,确实存在后台进程的退出信号和用户的输入可能交错在一起的情况,但这种情况并不是Shell所期望的,也不是设计上的必然结果。这种交错通常是由于多个进程同时向同一个输出流(如标准输出或标准错误)写入数据,并且输出缓冲机制的作用导致的。


四.使用函数产生信号

🥪kill函数:

1.函数原型:

头文件:

#include <sys/types.h>
#include <signal.h>

函数原型:

int kill(pid_t pid, int sig);

作用:

kill - send signal to a process

2.函数解析:

函数的作用是给一个指定的进程发送指定的信号,pid是指定进程的pid,sig是信号的编号。

3.函数实践

下面是通过kill给自己发信号,然后到达执行自定义行为的过程。通过kill函数,

我们可以获取命令行的信息,实现自己的kill命令,直接和系统接轨。

#include <iostream>
#include <unistd.h>
#include <signal.h>void handle(int signo)
{std::cout << "signo:" << signo << "系统命令" << std::endl;
}int main()
{// 自定义SIGINT-2号信号的行为,让二号信号不再执行终止进程的操作::signal(SIGINT, handle);sleep(2);::kill(getpid(), 2);while (true){std::cout << "pid:" << getpid() << std::endl;sleep(1);}return 0;
}

🥪 raise函数和abort函数:

1.raise函数:

raise函数只能给当前的进程发送一个指定的信号,进程的固定的,信号的种类可以选择。

使用场景:

当一个进程需要主动触发某个信号时,可以使用raise函数。例如,在信号处理函数中捕获到一个信号后,通过raise函数手动发送另一个信号作为后续操作。

头文件:

#include <signal.h>

函数原型:

int raise(int sig);

2.abort函数:

所在库:

#include <stdlib.h>

函数原型:

void abort(void);

abort没有返回任何值,总是运行失败。

使用场景:用于调试触发断点

abort函数主要用于处理系统错误,在调试中触发断点以便检查程序状态,以及确保程序在出现异常时不会继续执行无用操作。


五.由软件条件产生信号

本点的主人公是:alarm函数

5.1alarm函数介绍:

作用:
alarm - set an alarm clock for delivery of a signal

所在库:
#include <unistd.h>

函数原型:

unsigned int alarm(unsigned int seconds);

alarm的作用是给进程设置一个闹钟,到时间到了的时候,就会给进程发送一个SIGALRM信号。

如果参数为0,就是取消之前设置的闹钟,只能设置一个。当之前设置的闹钟还没结束,又去设置一个信号的闹钟,那么返回值就是之前闹钟剩余的秒数。

5.2函数使用:

#include <iostream>
#include <unistd.h>
#include <signal.h>void handle(int signo)
{std::cout << "signo:" << signo << "闹钟响啦" << std::endl;
}int main()
{// 自定义SIGLRM信号的行为,让信号不再执行终止进程的操作::signal(SIGALRM, handle);::alarm(3);while (true){std::cout << "pid:" << getpid() << std::endl;sleep(1);}return 0;
}

5.3理解软件条件产生信号:

alarm函数,是在操作系统内核设置了一个定时器,在时间到了的时候就会给进程发送SIGALRM信号,在操作系统内核设置,操作系统也是一个软件,所以是属于软件层面的。

这些条 件包括但不限于定时器超时(如alarm函数设定的时间到达)软件异常(如向已关闭的管道写数据产⽣的SIGPIPE信号)等。

5.4OS如何管理信号:

学了那么就的面向对象,在管理一个东西的时候,当然是先描述,再组织啦。

下面OS对于闹钟的描述,其中包括了剩余时间entry还有执行方法function

六.硬件条件产生信号:

当发生硬件异常的时候,硬件会通过异常等信息告诉操作系统,然后让操作系统结束该进程。当然,我们也可以捕捉这个信号,让它不执行结束进程的操作。

1.当代码中有除以0,或者其他的错误,CPU会产生异常,操作系统OS对于这个异常的处理方法是:对进程发送SIGFPE信号。

2.⽐如当前进程访问了⾮法内存地址, MMU会产⽣异常,内核将这个异常解释为SIGSEGV信号发送
给进程。

除0导致的CPU异常。

#include <iostream>
#include <unistd.h>
#include <signal.h>void handle(int signo)
{std::cout << "signo:" << signo << ",CPU异常" << std::endl;sleep(1);
}int main()
{// 自定义SIGFPE号信号的行为,让SIGFPE信号不再执行终止进程的操作::signal(SIGFPE, handle);int n = 1 / 0;return 0;
}

 

在这里,为什么会循环打印这个了? 

因为在除0以后,进程PCB中,一直保存这该进程出现了异常,不能继续往下执行,所以CPU每次从信号处理完以后,准备进入主控制流的时候,还会进行检查,结果除0异常的信息还没被处理,那么OS又会给进程发送SIGFPE信号。

七.本篇总结:

🍒1.上面信号产生的方法,都要经过OS这一步,因为信号是发给进程的,OS是进程的管理者。

🍒2.信号是否立刻执行?不会立刻执行,只有当block解除以后,才能处理信号,如果不解除block,那么永远不会处理信号。

🍒3.在进程还没收到信号的时候,在handler表中就已经有对应信号的执行方法。

🍒4.如果信号是被立刻执行,那么它会把pending表对应的位图置为1。


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/489791.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2021 年 6 月青少年软编等考 C 语言四级真题解析

目录 T1. 数字三角形问题思路分析T2. 大盗思路分析T3. 最大子矩阵思路分析T4. 小球放盒子思路分析T1. 数字三角形问题 上图给出了一个数字三角形。从三角形的顶部到底部有很多条不同的路径。对于每条路径,把路径上面的数加起来可以得到一个和,你的任务就是找到最大的和。 注…

购物车案例--分模块存储数据,发送请求数据渲染,底部总计数量和价格

shift鼠标右键&#xff0c;打开powershell&#xff0c;新建项目 自定义 只有一个页面&#xff0c;不涉及路由&#xff0c;勾选vuex,css,babel 无需保存预设 回车项目开始创建 项目用vscode打开 将src里的内容全部清空 将第七天的课程准备代码复制粘贴到src中 刷新页面&…

内网是如何访问到互联网的(华为源NAT)

私网地址如何能够访问到公网的&#xff1f; 在上一篇中&#xff0c;我们用任意一个内网的终端都能访问到百度的服务器&#xff0c;但是这是我们在互联网设备上面做了回程路由才实现的&#xff0c;在实际中&#xff0c;之前也说过运营商是不会写任何路由过来的&#xff0c;那对于…

C++编程: 基于cpp-httplib和nlohmann/json实现简单的HTTP Server

文章目录 0. 引言1. 完整实例代码2. 关键实现3. 运行与测试 0. 引言 本文基于 cpp-httplib 和 nlohmann/json 实现简单的 HTTPS Server 实例代码&#xff0c;这两个库均是head-only的。 1. 完整实例代码 如下实例程序修改自example/server.cc #include <httplib.h>#i…

收银pos源代码(Win版+安卓版)

1.收银pos版本 支持市面上主流系统版本&#xff0c;如支持win版&#xff08;exe安装包&#xff09;、安卓版&#xff08;apk安装包&#xff09;&#xff1b; 2.多样化收银 支持Windows收银机、安卓收银机、ai智能称重、收银称重一体机、无人自助收银、手机端收银等&#xff…

springboot项目如何运行起来

时常开发好的springboot项目是如何运行起来的&#xff1f; 经常会使用到打包插件spring-boot-maven-plugin SpringBoot提供了一个插件spring-boot-maven-plugin用于把程序打包成一个可执行的jar包。在pom文件里加入这个插件即可&#xff1a; org.springframework.boot spring-b…

ubuntu18.04配置实时内核

ubuntu系统&#xff1a;18.04 当前内核&#xff1a;5.4.0-84-generic 待安装实时内核&#xff1a; 5.6.19-rt11 1、查看当前版本 uname -r 2、下载内核与补丁 一种方式从官网自己下载 官方内核下载地址官方补丁下载地址阿里镜像内核下载地址&#xff08;速度快&#xff0…

Centos7环境下安装Flink1.20

目录 介绍1、涉及安装包2、节点3、修改hostname4、将flink安装包上传并解压5、修改配置文件6、修改masters和workers&#xff08;所有节点&#xff09;7、集群启停 介绍 Flink 是一个分布式系统&#xff0c;需要有效分配和管理计算资源才能执行流应用程序。它集成了所有常见的…

EXCEL数据清洗的几个功能总结备忘

目录 0 参考教材 1 用EXCEL进行数据清洗的几个功能 2 删除重复值&#xff1a; 3 找到缺失值等 4 大小写转换 5 类型转化 6 识别空格 0 参考教材 精通EXCEL数据统计与分析&#xff0c;中国&#xff0c;李宗璋用EXCEL学统计学&#xff0c;日EXCEL统计分析与决策&#x…

深入解析Vue3响应式系统:从Proxy实现到依赖收集的核心原理

深入解析Vue3响应式系统&#xff1a;从Proxy实现到依赖收集的核心原理 响应式系统的基本原理 作为一个热门的JavaScript框架&#xff0c;Vue在3.x版本中引入了基于Proxy的响应式系统。这个系统的核心思想是利用Proxy对象拦截对数据的访问和修改&#xff0c;从而实现数据的自动更…

Visual Studio 2022 安装和管理 GitHub Copilot

文章目录 前言一、&#x1f6e0;️安装 GitHub Copilot1.1 安装 GitHub Copilot Chat1.2 使用 Visual Studio 安装程序进行安装1.3 使用“管理扩展”对话框进行安装&#xff08;推荐&#xff09; 二、&#x1f3ad;管理 Copilot 状态2.1 Copilot 处于活动状态2.2 Copilot 处于非…

git企业的使用详细命令行操作

git是Linux创始人通过内核开发而创作的分布式版本的控制系统&#xff0c;而我们作为开发者需要开发与维护&#xff0c;避免不了版本的迭代和更新&#xff0c;git就是用来保存修改删除等操作的工具&#xff0c;可以记录代码改动情况&#xff0c;它能够保存代码的每个版本&#x…

高中数学:随机变量-二项分布与超几何分布(独立重复实验)

文章目录 一、二项分布伯努利实验概率公式均值与方差公式归纳例题 二、超几何分布定义均值例题 一、二项分布 伯努利实验 概率公式 补充&#xff1a;二项式定理 均值与方差公式 归纳 例题 二、超几何分布 定义 均值 证明 例题

【Leetcode】滑动窗口算法-编程苍穹下划破数据暗夜的高效光弧

前言 &#x1f31f;&#x1f31f;本期讲解关于滑动窗口问题~~~ &#x1f308;感兴趣的小伙伴看一看小编主页&#xff1a;GGBondlctrl-CSDN博客 &#x1f525; 你的点赞就是小编不断更新的最大动力 &#x1f386;那么废话不多说直接…

go-zero(十二)消息队列

go zero 消息队列 在微服务架构中&#xff0c;消息队列主要通过异步通信实现服务间的解耦&#xff0c;使得各个服务可以独立发展和扩展。 go-zero中使用的队列组件go-queue&#xff0c;是gozero官方实现的基于Kafka和Beanstalkd 的消息队列框架,我们使用kafka作为演示。 一、…

Django基础之模板

一.前言 前面我们讲了视图&#xff0c;我们今天来讲一下模板&#xff0c;模板其实也就是视图中render返回的html进行的渲染&#xff0c;然后展示到浏览器页面上去&#xff0c;那我们今天就来和大家来说一下模板的基本用法 二.寻找html模板 这个也就是我们前面说了的找html&a…

基于回溯法解决八皇后问题+以位运算方法优化n皇后问题(算法与数据结构期末设计)

文章目录 基于回溯法解决八皇后问题以位运算方法优化n皇后问题1. 八皇后问题问题描述2.回溯法求八皇后&#xff08;n皇后&#xff09;问题①由四皇后问题引入②皇后的占位问题③皇后的放置过程④放置过程中的问题⑤回溯算法核心⑥回溯算法的求解过程⑦验证算法和代码实现LeetCo…

Linux - MySQL迁移至一主一从

Linux - MySQL迁移至一主一从 迁移准备安装MySQL ibd文件迁移原服务器操作目标服务器操作 一主一从增量同步异常解决结尾 首先部分单独安装MySQL&#xff0c;请参考Linux - MySQL安装&#xff0c;迁移数据量比较大约400G左右且网络不通故使用文件迁移&#xff0c;需开启一段时间…

PaddleOCR模型ch_PP-OCRv3文本检测模型研究(一)骨干网络

从源码上看&#xff0c;PaddleOCR一共支持四个版本&#xff0c;分别是PP-OCR、PP-OCRv2、PP-OCRv3、PP-OCRv4。本文选择PaddleOCR的v3版本的骨干网络作为研究对象&#xff0c;力图探究网络模型的内部结构。 文章目录 研究起点卷归层压发层残差层骨干网代码实验小结 研究起点 参…

数据结构——栈的模拟实现

大家好&#xff0c;今天我要介绍一下数据结构中的一个经典结构——栈。 一&#xff1a;栈的介绍 与顺序表和单链表不同的是&#xff1a; 顺序表和单链表都可以在头部和尾部插入和删除数据&#xff0c;但是栈的结构就锁死了&#xff08;栈的底部是堵死的&#xff09;栈只能从…