Linux信号捕捉
要处理信号, 我们进程就得知道自己是否收到了信号, 收到了哪些信号, 所以进程需要再合适的时候去查一查自己的pending位图 block 位图 和 hander表, 什么时候进行检测呢?
当我们的进程从内核态返回到用户态的时候, 进行信号的检测和处理。
我们就先简单的解释一下嘛, 内核态最常见的时候就是我们在使用系统调用的时候, 此时不仅仅我们要去执行系统调用里的代码, 我们还得有资格去访问操作系统内的资源, 所以此时操作系统会自动将我们的身份变化为内核身份, 这就是我们的内核态, 而用户态就是我们在执行我们自己编写的代码的时候的状态。
为什么要选择内核态返回到用户态的时候进行信号的检测呢?
因为可以保证此时进程一定没有在做重要的事情, 所以顺路就检测一下信号。
内核是如何实现信号捕捉的?

sigaction

接下来我们看看struct sigaction的结构

由于我们现在只关心普通信号, 所以我们只需要了解其中的第一个字段和第三个字段这两个字段就可以了。
其中 第一个其实就是一个函数指针, 他指向的就是处理这个信号的hander方法。
如果想快速的使用这个接口, 我们只需要使用第一个参数即可


问题1 pending位图是什么时候被处理的?
我们知道在处理完信号后pending位图会将信号对应的位置从1 -> 0, 但是, 具体是在什么时候变更的呢?
我们在handler方法的开头打印一下pending位图, 看看对于信号的位置是否为0, 如果为0那么就代表调用handler前pending就已经被处理了, 否则就是在调用玩handler后pending才被处理的。


可以发现2号位为0
所以就可以得出结论, 在调用handler前, 操作系统就已经将pending位图处理过了。

问题2 为什么在调用handler的时候要将对应的信号屏蔽呢?
因为如果我们hanlder里有系统调用, 那么就会存在内核态向用户态的变化, 就又会去检测信号, 可能会导致信号被嵌套调用。
可重入函数

假如我们在执行链表的头插, 刚执行完p->next = head进程就切走了, 切回来后我们会先进行信号的检测, 如果此时检测到一个信号然后去执行他的处理方法, 恰好他也要往链表头插, 那么这个函数有在handler中被进入了, 我们把这种现象称为函数的重复进入 简称 函数被重入了, 也就是main执行流还没执行完呢, handler执行流又去执行这个函数了。
最后就会变成这种情况

最后node2节点就丢失了, 这样就出了问题。
如果一个函数在被重复进入的情况下, 可能会出错, 我们称这种函数为不可重入函数否则称为可重入函数。
显然, 我们刚刚的那个insert就是不可重入函数。
注意: 可重入 或 不可重入 都不是褒义 或者 贬义, 他们只是描述现象。
目前我们所学到的大部分函数都是不可重入函数。
volatile关键字


我们不加优化编译运行, 发现按下Ctrl+ c后代码正常退出

而当我们加上优化后再运行

此时就发现退不了了。
由于不同的编译器处理策略不一样, 所以并不是所有的编译器都会发这个flag优化进CPU内寄存器的。
为什么这次没有退出呢?
我们可以看到, 当我们在按下ctrl + c 的时候, 打印出了catch 2 的消息, 说明此时flag应该是被置为1了的, 可是奇怪的是, 为什么进程没有退出呢?
正常情况下在执行!flag的时候, 是CPU先将flag从内存中读取到寄存器里, 然后再对flag执行逻辑运算, 而在优化后, 他发现了flag在内存中不会做修改, 那么他就不再去内存里拿flag了, 而是放在寄存器里直接用。
为了防止编译器的这种过分优化 我们可以使用volatile关键字来修饰这个flag


此时我们就发现, 按下ctrl + c后我们进程还是可以正常退出的。
volatile关键字的作用就是 防止编译器过度优化, 保持内存的可见性。
SIGCHLD信号(17号信号) - 了解即可




所以我们父进程在等待子进程的时候, 可以根据信号进行异步等待

但是我们还是必须得保证父进程不能再子进程之前退出!
上诉的代码还是有问题的, 因为父进程的子进程可能有很多个, 如果他们同时退出的话就只能成功的回收其中的一个了。

事实上, 由于Unix 的历史原因(Linux是仿Unix的), 想要不产生僵尸进程还有一种办法就是在父进程中将SIGCHLD的处理动作设为SIG_IGN, 这样的话fork出来的子进程将会在终止后自动被清除, 不会产生僵尸进程, 也不会通知父进程。
(系统默认的忽略动作通常与用户设置的SIG_IGN是一样的, 但是在这里是一个特例)
在官方手册里, 17号新号的默认动作其实不是SIG_IGN 而是 SIG_DFL, 只是SIG_DFL的动作是IGN也就是什么都不做。

相关文章:
Linux信号捕捉
要处理信号, 我们进程就得知道自己是否收到了信号, 收到了哪些信号, 所以进程需要再合适的时候去查一查自己的pending位图 block 位图 和 hander表, 什么时候进行检测呢? 当我们的进程从内核态返回到用户态的时候&…...
【Leetcode】 top100 round2 需要加强版
知识补充 python赋值的执行顺序: 在41中,对于测试案例[-1,4,3,1] 当i1时,以下两条语句的执行结果不一致: “nums[nums[i]-1], nums[i] nums[i], nums[nums[i]-1]” “nums[i], nums[nums[i]-1] nums[nums[i]-1], nums[i]” 解析…...
ElasticSearch知识点汇总
1、ES中的倒排索引是什么。 倒排索引,是通过分词策略,形成了词和文章的映射关系表,这种词典映射表即为倒排索引 2、ES是如何实现master选举的。 选举过程主要包括以下几个步骤: 心跳检测: 每个节点…...
phpize +Visual Studio + MSYS2 + bison 草稿记录并未正常完成
phpize Visual Studio MSYS2 bison 先安装 Visual Studio https://visualstudio.microsoft.com/zh-hans/vs/ 在安装过程中,选择安装工作负载。确保选择了 C 工作负载以及适用于 C 开发的相关组件,例如 MSVC v142 - VS 2022 C x64/x86 build tools。 …...
网络安全与IP地址的关联
网络安全与IP地址之间存在着密不可分的关系。IP地址作为网络通信的基础,对于网络安全的保障具有至关重要的作用。以下将详细探讨网络安全与IP地址之间的关联,以及IP地址在网络安全中的应用。 一、IP地址与网络安全的关系 IP地址是网络通信的基础&#x…...
罗德与施瓦茨 SMC100A信号发生器9kHz至3.2 GHz
罗德与施瓦茨 SMC100A信号发生器,9 kHz - 3.2 GHz 罗德与施瓦茨 SMC100A 以极具吸引力的价格提供出色的信号质量。它覆盖的频率范围为 9 kHz 至 1.1 GHz 或 3.2 GHz。输出功率为典型值。> 17 dBm。所有重要功能(AM/FM/φM/脉冲调制)均已集…...
新能源汽车充电站智慧充电电能服务综合解决方案
安科瑞薛瑶瑶18701709087/17343930412 ★解决方案 ✔目的地充电-EMS微电网平台 基于EMS解决方案从设备运维的角度解决本地充电的能量管理及运维问题,与充电管理平台打通数据,为企业微电网提供源、网、荷、储、充一体化解决方案。 ✔运营场站--电能服务…...
pytest(二):关于pytest自动化脚本编写中,初始化方式setup_class与fixture的对比
一、自动化脚本实例对比 下面是一条用例,使用pytest框架,放在一个类中,两种实现方式: 1.1 setup_class初始化方式 1. 优点: 代码结构清晰,setup_class 和 teardown_class 看起来像传统的类级别的 setup 和 teardown 方法。2. 缺点: 使用 autouse=True 的 fixture 作为…...
项目中遇到的问题
web项目中请求线程到service层的时候远程调用服务之前是串行化执行每个任务都要get阻塞等待任务完成,举例当用户在购物车页面点击去结算就会请求后台toTrade请求获取订单确认的详情数据并渲染到订单详情页,现在在toTrade请求中使用异步任务编排Completab…...
Deeplab的复现(pytorch实现)
DeepLab复现的pytorch实现 本文复现的主要是deeplabv3。使用的数据集和之前发的文章FCN一样,没有了解的可以移步到之前发的文章中去查看一下。 1.该模型的主要结构 对于代码部分,主要只写了模型部分的,其他部分内容基本和FCN的一致…...
input上添加disabled=“true“,点击事件失效处理办法
当我们给input标签上添加disabled"true"时,再添加点击事件,点击事件会不生效,处理办法如下: 给input标签添加样式style"pointer-events: none;" 代码如下: <input style"pointer-event…...
精酿啤酒的魅力:啤酒的与众不同风味
啤酒,作为世界上古老的酒精饮品之一,一直以来都以其与众不同的魅力吸引着无数人的味蕾。而精酿啤酒,作为啤酒中的佼佼者之一,更是以其丰富的口感和多样的风格,成为了啤酒爱好者的心头好。在这其中,Fendi cl…...
检测机构的双资质是什么?
CMA和CNAS是两种在检测、校准和认证领域具有权威性的资质。 CMA资质全称为“检验检测机构资质认定”(China Inspection Body and Laboratory Mandatory Approval)。它是根据《中华人民共和国计量法》等相关法规,由国家认证认可监督管理委员会…...
基于springboot的校园食堂订餐系统
文章目录 项目介绍主要功能截图:部分代码展示设计总结项目获取方式 🍅 作者主页:超级无敌暴龙战士塔塔开 🍅 简介:Java领域优质创作者🏆、 简历模板、学习资料、面试题库【关注我,都给你】 &…...
基于SpringBoot的高校推荐系统
项目介绍 当前,随着高等教育的不断普及,越来越多的学生选择考研究生来提高自身的学术水平和竞争力。然而,考研生在选择报考院校和专业时面临着众多的选择和信息不对称的问题。为了解决这些问题,一些网站和APP已经推出了相关的院校…...
了解 websocket
1. 概念 1、 websocket 是一种双向通行协议。实现了浏览器与服务器全双工通信,能更好的节省服务器资源和带宽并达到实时通讯的目的; 2、websocket连接成功后,只要连接不断开,通信就会一保持着; 3、要打开一个 WebS…...
C++中erase函数的用法
在C中,erase函数用于从容器中删除一个或一系列元素。它通常用于删除容器中的指定位置的元素或特定值的元素。 erase函数通常有两种用法: 删除指定位置的元素:erase(iterator position) 这种用法会删除容器中迭代器position指向的元素。 st…...
数字旅游以科技创新为核心竞争力:推动旅游服务的智能化、高效化,满足游客日益增长的旅游需求
一、引言 随着科技的飞速发展,数字旅游作为旅游业与信息技术结合的产物,正以其独特的魅力改变着传统旅游业的格局。科技创新作为数字旅游的核心竞争力,不仅推动了旅游服务的智能化、高效化,更满足了游客日益增长的旅游需求。本文…...
(MATLAB)安装指南
参考链接:MATLAB2019a安装教程(避坑版)...
社区智能奶柜:创业新机遇
社区智能奶柜:创业新机遇 在追求高质量生活的今天,健康食品成为大众焦点。社区智能奶柜适时登台,革新了居民获取新鲜牛奶的传统模式,为创业者开辟了一片蓝海市场。 一、新兴创业蓝海:牛奶随享站 日常膳食中…...
ollama部署本地大模型|translategemma-4b-it效果对比:vs NLLB-3B、vs SeamlessM4T-v2
ollama部署本地大模型|translategemma-4b-it效果对比:vs NLLB-3B、vs SeamlessM4T-v2 想在自己电脑上跑一个翻译模型,但又担心模型太大、速度太慢?今天我们来聊聊一个轻量级的新选择——Google推出的TranslateGemma-4b-it。更重要…...
【Spring】实战:构建SpringBoot + OAuth2.0微服务安全网关
1. 为什么需要微服务安全网关? 在电商后台这类复杂的微服务架构中,每个服务都需要处理用户认证和权限控制。想象一下,如果每个微服务都自己实现一套登录验证逻辑,不仅会造成代码重复,更会导致安全策略不一致、维护成本…...
RoboMaster装甲板灯条匹配算法实战:从图像预处理到目标框定(附完整C++/OpenCV源码)
1. 项目背景与核心挑战 RoboMaster机甲大师赛中的装甲板识别是自动瞄准系统的关键技术难点。赛场上高速移动的机器人装甲板通常配备LED灯条作为视觉标识,这种设计让计算机视觉算法能够在复杂环境下快速定位目标。但实际开发时会遇到几个头疼的问题:强光干…...
AI_NovelGenerator:如何在7天内完成传统写作需要3个月的长篇小说创作
AI_NovelGenerator:如何在7天内完成传统写作需要3个月的长篇小说创作 【免费下载链接】AI_NovelGenerator 使用ai生成多章节的长篇小说,自动衔接上下文、伏笔 项目地址: https://gitcode.com/GitHub_Trending/ai/AI_NovelGenerator 问题诊断&…...
OpenClaw自动化监控:GLM-4.7-Flash实时解析服务器日志告警
OpenClaw自动化监控:GLM-4.7-Flash实时解析服务器日志告警 1. 为什么需要日志自动化监控 每次服务器出现异常时,手动翻查Nginx日志就像在干草堆里找针。上个月我们线上服务遭遇CC攻击,等我从几百兆的access.log里筛选出异常IP时,…...
M5Stack舵机驱动库:PCA9685硬件PWM控制与多平台移植
1. 项目概述M5Hat-8Servos 是专为 M5Stack 生态设计的硬件驱动库,用于控制 M5Stack 官方推出的HAT-8SERVO扩展模块。该模块基于PCA9685 16通道12位PWM LED与伺服驱动芯片,通过 IC 总线与主控(如 M5Stack Core2、M5Stamp C3、M5Paper 等&#…...
终极免费方案:3分钟掌握英雄联盟身份伪装完整指南
终极免费方案:3分钟掌握英雄联盟身份伪装完整指南 【免费下载链接】LeaguePrank 项目地址: https://gitcode.com/gh_mirrors/le/LeaguePrank LeaguePrank是一款基于官方LCUAPI开发的英雄联盟个性化展示工具,通过安全合规的方式实现游戏身份伪装、…...
C语言字符串操作的高效实现与优化
1. C语言字符串操作的高效实现方法 1.1 标准字符串函数的效率问题 在C语言开发中, <string.h> 头文件提供的字符串处理函数是日常开发的基础工具。其中,字符串复制和连接函数使用最为频繁,但它们的效率问题往往被开发者忽视。 标准…...
OpenClaw怎么换大模型?3步免费切换各种大模型配置教程
手把手教你一键部署OpenClaw,连接微信、QQ、飞书、钉钉等,1分钟全搞定! 简单说一下:OpenClaw这玩意儿本身没带“大脑”,它就是个负责干活的躯壳,得靠接外面的大模型才能思考。想换个“大脑”其实就三步&am…...
OpenClaw安全指南:Qwen3-32B本地化部署的权限管控策略
OpenClaw安全指南:Qwen3-32B本地化部署的权限管控策略 1. 为什么需要特别关注OpenClaw的安全问题 第一次在本地部署OpenClaw时,我被它强大的自动化能力震撼了——这个AI助手能像真人一样操作我的电脑,从文件管理到网页浏览无所不能。但当我…...
