【linux进程信号(二)】信号的保存,处理以及捕捉

💓博主CSDN主页:杭电码农-NEO💓

⏩专栏分类:Linux从入门到精通⏪

🚚代码仓库:NEO的学习日记🚚

🌹关注我🫵带你学更多操作系统知识
  🔝🔝


在这里插入图片描述

进程信号

  • 1. 前言
  • 2. 信号阻塞,信号递到和信号忽略
  • 3. 进程是怎样保存信号的?
  • 4. 信号集操作函数
  • 5. 进程是如何捕捉信号的?
  • 6. 总结

1. 前言

上一篇文章了解到信号产生的四种方式,
但是信号产生后,然后呢?需要对信号
进行保存,最后对信号进行处理

如果你没有阅读过前一篇文章,或者不知道信号的默认处理方式,请先阅读这篇文章: 信号的基本概念

本章重点:

本篇文章着重讲解信号保存的方式以及
周边概率,信号阻塞,信号递达.理解
信号处理的默认方式,如何修改默认方法
最后会讲解进程是如何捕捉信号的?


2. 信号阻塞,信号递到和信号忽略

在讲解进程是如何保存信号之前,要
先了解下面几个概念:

  1. 信号递达:

实际执行处理信号的动作叫做信号的递达

  1. 信号的未决状态:

在信号产生到信号递达之间的状态叫做信号的未决状态

  1. 信号阻塞:

一旦一个信号被设置了阻塞之后,那么此进程就不会收到此信号

  1. 信号忽略:

一旦一个信号被设置为忽略,那么当这个信号来临后,进程不会对此信号做处理

  1. 阻塞和忽略的区别:

一个信号被阻塞后,它就不会递达,而忽略是指信号递达后,执行的动作是什么都不做


3. 进程是怎样保存信号的?

在进程的PCB中,存在三张和信号相关的表

在这里插入图片描述

更准确的讲,前两个结构是位图,最后一个是表(数组).

  1. block位图:

这个位图代表,在这个进程中,有哪些信号是被阻塞了的?位图的第一个元素为0,代表1号信号没有被阻塞,第n个位置为1,代表n号信号被阻塞了,也就是说0/1代表某个信号是否被阻塞,这个位图又被称为信号屏蔽字

  1. pending位图:

这个位图是进程存储信号的结构,位图中的第n个位置为0/1代表是否收到了n号信号,如若收到,会在后续进行处理,这个位图又被称为信号集

  1. handler数组:

首先,这个数组是一个函数指针数组,里面存储的是函数的地址,数组的n号元素存储的函数地址代表收到n号信号之后,要去处理信号时,需要调用的函数.在上图中,SIG_DFL宏代表这个函数就是此信号的默认处理函数,SIG_IGN宏代表收到这个信号后,直接忽略此信号,当然我们也可以自己写一个函数来充当信号的处理方法,这个后面会讲

在这里插入图片描述


4. 信号集操作函数

首先我想隆重介绍的是signal函数:

在这里插入图片描述

第一个参数代表要设置几号信号
第二个参数代表,信号到来需要调用哪个函数

下面可以进行一个简单的编码验证:

void mycatch(int signum)
{cout<<"进程捕捉到了一个信号,正在自定义处理中... "<<signum<<"pid: "<<getpid()<<endl;
}
int main()
{signal(SIGINT,mycatch);//既可以填写定义的宏,也可以直接写数字while(1){cout<<"我是一个进程,我正在运行...pid: "<<getpid()<<endl;sleep(1);}return 0;
}

下面的内容能掌握的最好:

在这里插入图片描述

信号集操作函数概览:

在这里插入图片描述

读取或更改信号屏蔽字:
在这里插入图片描述

下面是样例代码,有兴趣可以看看:

void showpending(sigset_t& tmp){for(int i=1;i<=31;i++){if(sigismember(&tmp,i))cout<<1;elsecout<<0;}cout<<endl;}void blocksig(int sig)//对指定信号对屏蔽{sigset_t bset;sigemptyset(&bset);sigaddset(&bset,sig);int n = sigprocmask(SIG_BLOCK,&bset,NULL);//只对sig号信号屏蔽assert(n==0);cout<<"block success!"<<endl;}int main(){cout<<getpid()<<endl;for(int i=1;i<=31;i++)//将所有信号都屏蔽掉blocksig(i);sigset_t pending;    while(1){sigpending(&pending);    showpending(pending);sleep(1);}return 0;}

5. 进程是如何捕捉信号的?

先说结论:

从内核态返回用户态时,会进行信号的检测和处理

在此之前,大家肯定会有疑问:什么是内核态?什么是用户态?为什么这两个状态会相互切换?下面就来解答这些问题:

用户态指的是程序在执行用户写的代码时,会使用用户态的身份来执行代码,那么什么时候会进入内核态呢?答案是代码中存在系统调用,代码出现异常等情况,操作系统会将身份切换为内核态来执行代码.所以为什么要切换状态呢?直接用用户态执行全部代码难道不行吗?答案一定是否认的,因为群众中有坏人,在执行系统调用时,由于是很底层的代码或函数,所以操作系统是不信任用户的,切换为内核态的一大原因是为了安全性.另一方面,使用内核态执行代码时的优先级非常高.那么操作系统是怎样在两个状态中做切换的呢?答案很简单,CPU有两套寄存器,一套是可见的,一套是不可见的,而在不可见的这一套寄存器中,有一个寄存器叫CR3,它表示当前CPU的执行权限,数值为1代表内核态,数值为3代表用户态

了解完前景知识后,我们就可以得出一些结论:

  1. 当程序执行系统调用时会进入到内核态
  2. 当执行完系统调用后,会回到用户态
  3. 在这期间会进行信号的检测和处理
  4. 如若此时检测到有信号到来,那么会把代码直接跳转到信号处理的函数处
  5. 当信号处理函数返回时还会执行特殊的系统调用,再回到内核态

下面可以用一张图来代表整个过程:

在这里插入图片描述

把图片简化一下,就得到了一个无穷大的图像:

在这里插入图片描述


6. 总结

大家下来可以去试试将所有的信号都设置为阻塞,或者忽略,会发生什么?一旦这样做,进程运行起来后使用CTRL+c或者CTRL+/都不能终止进程,并且使用kill命令也无法杀掉进程.即使如此,即使所有信号都被屏蔽或忽略,但第九号信号是无法被屏蔽和忽略的,所以任何情况下都可以使用kill -9 pid来杀掉一个进程

信号这一章节是我们学习进程的最后一节,由于信号与进程的紧密关系,所以学习信号至关重要,除此之外,当子进程退出时也会向父进程发生SIG_CHILD信号,假设父进程并不想关心子进程的退出结果,只想执行自己的代码,那么我们可以将SIGCHLD信号设置为忽略,这样一来,父进程收到子进程退出的信号后就不会再拿一部分时间或资源来处理子进程了!


🔎 下期预告:线程的基本概念 🔍

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

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

相关文章

新装idea后的常用配置

&#xff08;所有为idea new project配置默认配置的都是 File -> New Projects Settings -> Settings for New Projects&#xff09; 1. 修改编码格式 大多数软件默认编码都是GBK&#xff0c;还有其他的&#xff0c;不过我们都是使用UTF-8的&#xff0c;这里统一设置为…

Python 语句(二)【循环语句】

循环语句允许执行一个语句或语句组多次&#xff0c;其程序流程图如下&#xff1a; 在python中有三种循环方式&#xff1a; while 循环 当判断条件为 true 时执行循环体&#xff0c;否则退出循环体。for 循环 重复执行语句嵌套循环 &#xff08;在while循环体中嵌套for循环&…

Java - Spring MVC 实现跨域资源 CORS 请求

据我所知道的是有三种方式&#xff1a;Tomcat 配置、拦截器设置响应头和使用 Spring MVC 4.2。 设置 Tomcat 这种方式就是引用别人封装好的两个 jar 包&#xff0c;配置一下web.xml就行了。我也并不推荐&#xff0c;这里放两个我在网上找到的配置相关文章&#xff0c;感兴趣可…

Netty架构

Netty逻辑架构 Netty 的逻辑处理架构为典型网络分层架构设计&#xff0c;网络通信层、事件调度层、服务编排层。 一、 网络通信层 网络通信层的职责是执行网络 I/O 的操作。它支持多种网络协议和 I/O 模型的连接操作。当网络数据读取到内核缓冲区后&#xff0c;会触发网络事件…

OSPF NSSA实验简述

OSPF NSSA实验简述 1、OSPF NSSA区域配置 为解决末端区域维护过大LSDB带来的问题&#xff0c;通过配置stub 区域或totally stub区域可以解决&#xff0c;但是他们都不能引入外部路由场景。 No so stuby area &#xff08;区域&#xff09;NSSA 可以引入外部路由&#xff0c;支持…

北斗卫星技术助力环卫车智能化改造

北斗卫星技术助力环卫车智能化改造 在现代城市环境中&#xff0c;环卫工作一直是一项重要的公共服务&#xff0c;而环卫车则是环卫工作的重要工具之一。随着科技的不断发展和进步&#xff0c;北斗卫星技术的应用逐渐走进了人们的视野&#xff0c;为环卫车的智能化改造提供了全…

2024年【道路运输企业安全生产管理人员】复审考试及道路运输企业安全生产管理人员模拟考试题

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 2024年道路运输企业安全生产管理人员复审考试为正在备考道路运输企业安全生产管理人员操作证的学员准备的理论考试专题&#xff0c;每个月更新的道路运输企业安全生产管理人员模拟考试题祝您顺利通过道路运输企业安全…

脉宽调制PWM控制器有哪些国产替代可选择?

一、脉宽调制PWM简介 PWM的理论基础为面积等效原理&#xff0c;这个原理简单描述就是冲量相等&#xff08;信号对时间的积分&#xff0c;即面积&#xff09;而形状不同的窄脉冲加在具有惯性的环节上时&#xff0c;其效果基本相同。冲量相等而形状不同的窄脉冲加在具有惯性的环…

虾皮、lazada店铺运营攻略,如何搭建高效、稳定的自养号测评系统

随着电子商务的蓬勃发展&#xff0c;越来越多的人选择在虾皮这样的电商平台上开设店铺&#xff0c;以实现创业梦想。但如何在众多店铺中脱颖而出&#xff0c;成为消费者的首选?本文将为您详细解答“怎么样做好虾皮店铺”&#xff0c;并提供一些实用的运营建议。 一、怎么样做…

【文献计量】安装endnote注意事项

1.前言 EndNote 是一款广受学者、研究人员、学生和图书管理员等使用的参考管理软件。它由 Clarivate Analytics 开发&#xff0c;用于管理文献引用和编排参考文献列表。EndNote 可以帮助用户在撰写科研论文、书籍或任何学术出版物时&#xff0c;高效地组织、管理和引用研究资料…

C++ 有边数限制的最短路 Bellman_ford算法(带负权边)

给定一个 n 个点 m 条边的有向图&#xff0c;图中可能存在重边和自环&#xff0c; 边权可能为负数。 请你求出从 1 号点到 n 号点的最多经过 k 条边的最短距离&#xff0c;如果无法从 1 号点走到 n 号点&#xff0c;输出 impossible。 注意&#xff1a;图中可能 存在负权回路…

第3部分 原理篇3可验证凭证(VC)(1)

3.3. 可验证凭证 3.3.1. 本节内容概述 本聪老师&#xff1a;今天开始去中心化身份中另一个最重要的概念可验证凭证&#xff08;verifiable credential&#xff09;的学习。凭证&#xff0c;也就是证件&#xff0c;在人类生活中不可或缺。可验证凭证实现了凭证的机器可读、加密…

Vmware创建共享文件夹

具体设置步骤如下&#xff1a; 打开 “设置 -> 选项 -> 共享文件夹” 点击 “选项 -> 共享文件夹 ->选择总是开启 ->添加” 添加共享文件夹 选择主机路径和设置名称 选择启用此共享&#xff0c;并且点击完成退出。 挂载操作 在root用户下执行具体命令如下&…

mysql 时间精度问题

timestamp到2038年&#xff0c;还有14年时间&#xff0c;一个系统如果能活到那一刻也是相当不错了。 这里先看一下个datetime的问题,下面的插入数据的时间戳是2024-03-06 21:20:50.839 INSERT INTO psi_io_balance ( id, as_id, bill_date, order_id, busi_type, direction, c…

安卓简单登录

注意 有的朋友不知道登录咋写&#xff0c;这里我就简单给出相应代码&#xff0c;用的本地存储&#xff0c;没用网络请求&#xff0c;有需要可以替换成想要的&#xff0c;废话不多上代码 登录 import androidx.appcompat.app.AppCompatActivity;import android.content.Context…

JVM入门篇(面试前速补)

近期看看JVM&#xff0c;看了狂神说入门教学&#xff0c;总结下给大家。 文章目录 1、JVM的位置2、JVM的结构体系3、类加载器及双亲委派机制3.1、类加载器作用3.2、类加载器类型3.3、双亲委派机制 * 4、沙箱安全机制5、Native、方法区5.1、Native&#xff08;本地方法栈引用&a…

【SQL】1068. 产品销售分析 I

题目描述 leetcode题目&#xff1a;1068. 产品销售分析 I 写法 select Product.product_name, Sales.year, Sales.price from Sales left join Product on Sales.product_id Product.product_id记录细节&#xff1a;加上表名检索效率更高。 -- ERROR: 时间超出限制 > 加…

181基于matlab的利用LMS算法、格型LMS算法、RLS算法、LSL算法来估计线性预测模型参数a1和a2

基于matlab的利用LMS算法、格型LMS算法、RLS算法、LSL算法来估计线性预测模型参数a1和a2&#xff1b;预测信号由二阶线性预测模型产生。2.利用LMS算法和RLS算法将一个叠加有噪声的信号实现噪声消除&#xff0c;恢复原始信号。有22页试验分析文档。&#xff08;包括程序在内&…

华为OD机试 - 疫情扩散时间计算 - 矩阵(Java 2024 C卷 200分)

目录 专栏导读一、题目描述二、输入描述三、输出描述四、解题思路五、Java算法源码六、效果展示1、输入2、输出3、说明 华为OD机试 2024C卷题库疯狂收录中&#xff0c;刷题点这里 专栏导读 本专栏收录于《华为OD机试&#xff08;JAVA&#xff09;真题&#xff08;A卷B卷C卷&am…

解决 Python 脚本无法生成结果的问题

我们在python编程时&#xff0c;始终无法生成想要的成果&#xff0c;其实问题并非单一的&#xff0c;可能有多种情况导致的结果&#xff1b;例如&#xff1a;语法错误、运行时错误、依赖项问题、权限问题、死锁或阻塞等问题&#xff0c;下面我将举例说明遇到这些问题该如何解决…