Linux信号补充——信号捕捉处理

一、信号的捕捉处理

​ 信号保存后会在合适的时间进行处理;

1.1信号处理时间

​ 进程会在操作系统的调度下处理信号,操作系统只管发信号,即信号处理是由进程完成的

​ 1.信号处理首先进程得检查是否有信号;2.进程要处于内核状态才能处理信号;

即进程会在内核态返回用户态的时候检查并处理信号

在这里插入图片描述

​ 对于程序的执行有一部分是自己写的,有一部分是库提供的,还有一部分是操作系统提供的;执行操作系统提供的代码需要进行身份的切换,执行自己写的和库提供的一般是以用户态的身份执行,执行系统调用,或者是进入操作系统内部(如硬件中断,根据中断号执行内核的终端表方法)需要以内核态的身份进行;

​ 操作系统可以响应外部硬件的中断,也可以响应内部软件产生的中断;int 80(是一条汇编也是CPU可以认识的指令)就是一种软件中断,功能是让进程从用户态陷入内核态;

​ 总结:程序运行时,会从代码区开始执行,执行到函数调用时触发int 80将ecs后两位由11变成00,进入内核态,根据用户级页表映射进入内核空间执行代码,根据内核级页表映射到内存空间,执行代码,返回时要先执行一次do signal(当前进程对信号做一次检测,对pending表,block表的检测),如果不需要处理,直接变成用户态,将ecs寄存器的后两位由00变成11,并且返回到原先用户空间执行代码处;否则先将pending表对应信号位置零,对于忽略方式直接返回,默认方式直接执行,都是在内核空间处理,而对于自定义处理需要先将身份转换为用户态(因为操作系统不信任用户的代码,有风险)然后执行完使用sigreturn(使用函数压栈的方式传入的此函数,所以可以执行)返回内核态跳转之前的位置,然后在跳转回用户态执行的地方;

​ 要注意main和sighandler是两个不同的执行流不是调用和被调用的关系;

在这里插入图片描述

​ 对于自定义信号处理进行了4次身份切换,两次信号的检测,而默认和忽略方式处理信号只是进行了2次身份切换,1次信号检测;

​ 由于进程是会被调度的,进程上下文的恢复和进程调度的实现都是在内核空间的,所以一定会由频繁的身份切换,所以一定会对信号进行检测;

1.2信号处理接口

#include <signal.h>
typedef void (*sighandler_t)(int);
sighandler_t signal(int signum, sighandler_t handler);
#include <signal.h>
int sigaction(int signum, const struct sigaction *act, struct sigaction *oldact);
//既可以处理普通信号也可以处理实时信号
struct sigaction {void     (*sa_handler)(int);void     (*sa_sigaction)(int, siginfo_t *, void *);//不关心,处理实时信号sigset_t   sa_mask;//,除了当前信号自动屏蔽,还可以选择将多个信号屏蔽int        sa_flags;//不关心,默认设为0void     (*sa_restorer)(void);//不关心
};
//与signal使用类似只不过需要传入结构体对象;

​ 信号处理前会先将pending位图对应位置的1置为0;

​ 当某个信号的处理函数被调用时,内核自动将当前信号加入进程的信号屏蔽字,当信号处理函数返回时自动恢复原来的信号屏蔽字,这样就保证了在处理某个信号时,如果这种信号再次产生,那么 它会被阻塞到当前处理结束为止。 如果在调用信号处理函数时,除了当前信号被自动屏蔽之外,还希望自动屏蔽另外一些信号,则用sa_mask字段说明这些需要额外屏蔽的信号,当信号处理函数返回时自动恢复原来的信号屏蔽字。

上述方式可以防止信号捕捉函数被重复调用

二、补充话题

2.1可重入函数

​ 当头插节点时,有三个位置newnode1,prev,cur三个节点指针,刚完成刚完成newnode1和cur节点的链接,还没有执行prev和newnode1的链接,因为信号的处理跳转到新的执行流,刚好信号处理也是头插,使用的是newnode2,这次执行是完整的,返回用户态是继续执行会将指向newnode2的prev指向了newnode1,这样会导致newnode2丢失导致内存泄漏;

​ 如上现象就是函数被重入了,对于函数如果重入了出错,则该函数就是不可重入函数,反之就是可重入函数;

​ 信号处理和main执行流并不是和多线程一样一旦创建线程执行流就开始运行,并且和main执行流是并行的,而是取决于信号并且执行信号流时会使得main执行流被暂停,是一个进程的不同执行流;

2.2volatile

​ volatile作用是保持内存可见性;进行运算(算术运算或者逻辑运算),都会进入CPU的运算器进行;

​ 在优化条件下如果只是对变量读取不进行修改,可能变量会被优化到寄存器里面,而不是内存中,这样优化是的不需要进行访存,提高了效率;

​ 如:设置全局变量,main执行流只是进行了读取,而信号执行流进行了写入,这时候编译器优化,main执行流不从内存中读取,而是从寄存器读取,但是寄存器中的内容并不会被修改,信号执行流进行了写入,内存中实实在在的被修改了;这时候就会导致全局变量即使被修改了,但是main在执行流不可见;所以需要在全局变量前加volatile关键字修饰,保持内存的可见性,使得main执行流从内存中进行读取;

register是一个建议性关键字用来进行优化,还是会创建变量,但是可能会将变量内容放到寄存器;

2.2.1Linux gcc/g++优化

gcc -O .c文件
#选项包括-O0到-O3;0表示没有优化,1-3从低到高进行优化;

2.3SIGCHID

​ 子进程退出时,父进程必须进行等待,否则子进程就会变成僵尸状态;

​ 等待的目的:1.使得子进程可以被回收;2.获得子进程的退出信息;3.由于子进程的退出是未知的,所以父进程需要阻塞或者是非阻塞的方式进行等待,要保证父进程是最后一个退出的;

子进程并不是直接就退出了,而是会向父进程发送信号的;此信号就叫做SIGCHID(17号)信号

​ 进程等待可以采用基于信号的方式实现异步等待;要保证父进程在这期间是一直运行的;

​ 使用waitpid非阻塞的方式或者是基于信号的等待都可以使得父进程继续运行,不用阻塞;

​ 关于多个子进程等待,使用-1来接受任意多个子进程,使用WNOHANG防止等待时,有进程不退出导致阻塞;

​ 对于信号实现子进程的等待也可以不调用waitpid;事实上,由于UNIX的历史原因,要想不产生僵尸进程还有另外一种办法:父进程调用sigaction将SIGCHLD的处理动作置为SIG_IGN,这样fork出来的子进程在终止时会自动清理掉,不会产生僵尸进程,也不会通知父进程。系统默认的忽略动作和用户用sigaction函数自定义的忽略通常是没有区别的,但这是一个特例。此方法对于Linux可用,但不保证在其它UNIX系统上都可用;

​ 17号信号的默认处理方式是忽略,而忽略方式是自动清理子进程;

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

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

相关文章

uniapp开发微信小程序取消原生导航栏+自定义导航栏

1、取消原生导航栏 如图&#xff1a;将页面中的原生导航取消 在page.json中需要取消的页面中加入"navigationStyle": "custom" 例如&#xff1a; {"path": "pages/index/index","style": {"navigationBarTitleText&…

浏览器工作原理与实践--HTTP请求流程:为什么很多站点第二次打开速度会很快

在上一篇文章中我介绍了TCP协议是如何保证数据完整传输的&#xff0c;相信你还记得&#xff0c;一个TCP连接过程包括了建立连接、传输数据和断开连接三个阶段。 而HTTP协议&#xff0c;正是建立在TCP连接基础之上的。HTTP是一种允许浏览器向服务器获取资源的协议&#xff0c;是…

git常见使用

1. 概念 分布式&#xff0c;有远程仓库和本地仓库的概念&#xff0c;因此要注意同步问题git是面向对象的&#xff0c;本质是内容寻址系统。.git目录下有个文件夹objects&#xff0c;存储git库中的对象&#xff0c;git就是根据object建立一种树形结构&#xff0c;将文件和通过h…

超越 GPT-4V 和 Gemini Pro!HyperGAI 发布最新多模态大模型 HPT,已开源

随着AI从有限数据迈向真实世界&#xff0c;极速增长的数据规模不仅赋予了模型令人惊喜的能力&#xff0c;也给多模态模型提供了更多的可能性。OpenAI在发布GPT-4V时就已经明确表示&#xff1a; 将额外模态&#xff08;如图像输入&#xff09;融入大语言模型&#xff08;LLMs&am…

【机器学习-08】参数调优宝典:网格搜索与贝叶斯搜索等攻略

超参数是估计器的参数中不能通过学习得到的参数。在scikit-learn中&#xff0c;他们作为参数传递给估计器不同类的构造函数。典型的例子有支持向量分类器的参数C&#xff0c;kernel和gamma&#xff0c;Lasso的参数alpha等。 ​ 在超参数集中搜索以获得最佳cross validation交叉…

【C语言基础】:字符串函数(二)

文章目录 一、strncpy函数的使用二、strncat函数的使用三、strncmp函数的使用四、strstr函数的使用和模拟实现4.1 strstr函数的使用4.2 strstr函数的模拟实现 五、strtok函数的使用六、strerror函数的使用 上节回顾&#xff1a;【C语言基础】&#xff1a;字符函数和字符串函数 …

基于java+springboot+vue实现的健身房管理系统(文末源码+Lw+ppt)23-523

摘 要 健身房管理的以往工作流程繁杂、多样、管理复杂与设备维护繁琐。而如今计算机已完全能够胜任健身房管理工作&#xff0c;而且更加准确、方便、快捷、高效、清晰、透明&#xff0c;它完全可以克服以上所述的不足之处。这将给查询信息和管理带来很大的方便&#xff0c;从…

Docker部署Alist全平台网盘神器结合内网穿透实现无公网IP访问云盘资源

&#x1f308;个人主页: Aileen_0v0 &#x1f525;热门专栏: 华为鸿蒙系统学习|计算机网络|数据结构与算法|MySQL| ​&#x1f4ab;个人格言:“没有罗马,那就自己创造罗马~” #mermaid-svg-oZuxWTWUiXLx3aQO {font-family:"trebuchet ms",verdana,arial,sans-serif;f…

数据本地性如何助力企业在云上实现高效机器学习

分享嘉宾&#xff1a; Lu Qiu, Shawn Sun 本文将讨论数据本地性对于在云上进行高效机器学习的重要性。首先对比现有解决方案的利弊&#xff0c;并综合考虑如何通过数据本地性来降低成本和实现性能最大化。其次会介绍新一代的Alluxio设计与实现&#xff0c;详细说明其在模型训练…

刷题28-30(力扣0322/0078/0221)

0322. 零钱兑换 题目&#xff1a; 给你一个整数数组 coins &#xff0c;表示不同面额的硬币&#xff1b;以及一个整数 amount &#xff0c;表示总金额。计算并返回可以凑成总金额所需的 最少的硬币个数 。如果没有任何一种硬币组合能组成总金额&#xff0c;返回 -1 。你可以…

一文带你看懂 前后端之间图片的上传与回显

一文带你看懂 前后端之间图片的上传与回显 前言 看了很多类似的文章&#xff0c;发现很多文章&#xff0c;要不就是不对&#xff0c;要不就是代码写的不通俗易懂&#xff0c;所以有了这篇文章&#xff0c;我将会从原理到实战&#xff0c;带你了解 实战包含前端 原生 vue3 rea…

Gold Effects

HDRP、URP、LWRP和标准支持 完全可定制的金币效果。几乎每个属性都是可调整的,您可以更改这些效果的颜色、渐变、噪波纹理和整体形状。支持HDRP、URP和LWRP,当然也支持标准渲染器。易于拖放设置,带有定制示例的演示场景。使用标准Unity Animator为箱子制作动画,因此您可以轻…

Python爬虫与数据可视化源码免费领取

引言 作为一名在软件技术领域深耕多年的专业人士&#xff0c;我不仅在软件开发和项目部署方面积累了丰富的实践经验&#xff0c;更以卓越的技术实力获得了&#x1f3c5;30项软件著作权证书的殊荣。这些成就不仅是对我的技术专长的肯定&#xff0c;也是对我的创新精神和专业承诺…

电子科技大学链时代工作室招新题C语言部分---题号H

1. 题目 最有操作的一道题&#xff0c;有利于对贪心算法有个初步了解。 这道题的开篇向我们介绍了一个叫汉明距离的概念。 汉明距离指的就是两个相同长度的字符串的不同字符的个数。 例如&#xff0c;abc和acd&#xff0c;b与c不同&#xff0c;c与d不同&#xff0c;所以这两个…

每周一算法:迭代加深A*

题目链接 AcWing 180. 排书 题目描述 给定 n n n 本书&#xff0c;编号为 1 ∼ n 1\sim n 1∼n。 在初始状态下&#xff0c;书是任意排列的。 在每一次操作中&#xff0c;可以抽取其中连续的一段&#xff0c;再把这段插入到其他某个位置。 我们的目标状态是把书按照 1 ∼…

牛客题霸-SQL进阶篇(刷题记录一)

本文基于前段时间学习总结的 MySQL 相关的查询语法&#xff0c;在牛客网找了相应的 MySQL 题目进行练习&#xff0c;以便加强对于 MySQL 查询语法的理解和应用。 由于涉及到的数据库表较多&#xff0c;因此本文不再展示&#xff0c;只提供 MySQL 代码与示例输出。 部分题目因…

青海200MW光伏项目 35kV开关站图像监控及安全警示系统

一、背景 随着我国新能源产业的快速发展&#xff0c;光伏发电作为清洁能源的重要组成部分&#xff0c;得到了国家政策的大力扶持。青海作为我国光伏资源丰富地区&#xff0c;吸引了众多光伏项目的投资建设。在此背景下&#xff0c;为提高光伏发电项目的运行效率和安全性能&…

基于Java中的SSM框架实现万卷图书馆书籍借阅管理系统项目【项目源码+论文说明】

基于Java中的SSM框架实现万卷图书馆书籍借阅管理系统演示 摘要 图书管理系统&#xff0c;是一个由人、计算机等组成的能进行管理信息的收集、传递、加工、保存、维护和使用的系统。利用信息控制企业的行为&#xff1b;帮助企业实现其规划目标。 图书馆管理系统&#xff0c;能…

二、typescript基础语法

一、条件语句 二、函数 1、有名函数 function add(x:number, y:number):number {return x y;}2、匿名函数 let add function (x:number, y:number):number {return x y;}函数可选参数 function buildName(firstname: string, lastname?:string) {if (lastname) {return fi…

asp.net mvc 重新引导视图路径,改变视图路径

asp.net mvc 重新引导视图路径&#xff0c;改变视图路径 使用指定的控制器上下文和母版视图名称来查找指定的视图 通过本文学习&#xff0c;你可以根据该技法&#xff0c;去实现&#xff0c;站点自定义皮肤&#xff0c;手机站和电脑站&#xff0c;其他设备站点&#xff0c;在不…