Linux-信号执行
1. 信号什么时候被处理
当进程从内核态返回到用户态的时候,进行信号的检测和处理
什么内核态,什么又是用户态呢?
当进程在CPU上运行时,内核态:允许进程访问操作系统的代码和数据,用户态:进程只能访问用户自己的代码和数据
为什么要有,用户态和内核态呢?
因为进程需要访问系统内的资源,以及调用系统函数接口,例如IO就是系统调用,一个进程只有在内核态通过系统调用才能访问操作系统的资源,这样可以保证系统的安全性
从用户态切换到内核态的方式:
- 系统调用(int 80)
- 异常
- 外围设备中断
CPU内部有一个ecs寄存器,它的后两位标识进程属于内核态还是用户态,00标识内核态,11标识用户态。int 80 汇编语句可以让ecs从11变成00,从用户态切换到内核态
内核态和用户态分离是如何实现的?
操作系统的代码和数据在物理内存中只有一份,在计算机刚刚启动的时候,就是在加载OS,内核级页表在操作系统中也是只有一份,它映射整个操作系统的代码和数据,而且每个进程的虚拟内存的内核空间的内容都是一样的,都是通过内核级页表映射来的。每个进程共享内核空间,而用户空间是进程独有的,所以用户级页表有很多个,每个进程独有一份。
每个进程需要访问系统资源,调用系统接口,就会从用户态切换到内核态,代码从用户区的代码跳转到内核区执行,当内核区的代码执行完,就会返回用户区,也就会从内核态切回用户态,也就是这个时候,检测进程的pending信号集。
2. 信号如何被处理
处理流程:
如果信号的处理动作不是自定义的,那么就会在第三步处理信号,处理完毕后如果进程还活着,就返回用户模式,并继续执行
sighandler和main是两个独立的控制流,使用的是不同的栈空间
在上一篇博客留下了一个问题:
如果调用sigprocmask解除了对当前若干个未决信号的阻塞,则在函数返回前,至少将其中一个信号递达(在下一篇博客中解答为什么)
因为当调用sigprocmask,也就是系统调用,就会从用户态切换到内核态,在函数返回前,也就是从内核态切回到用户态前,会进行信号检测,也就会信号递达,至少一个是为啥呢?
这是因为可能在自定义信号处理的过程中发生状态切换,可能是系统调用,也可能是中断,都有可能。自定义信号处理是上面图的第四步,处于用户态,如果切换成内核态再切回的过程中,就会再一次处理信号。甚至可以一直这样。
但是这种情况,有时候并不是我们想要的,例如一个进程一直再给另一个进程发送某个信号,这就可能会出现,当前自定义的信号还没处理完,接着又去处理下一个信号。特别是同一个信号,最容易出现这种情况,会死循环。
但是其实操作系统提供了对应的接口设置,操作系统的设计者已经想到了
函数功能:
自定义信号的处理方法,设置信号屏蔽字,当处理该信号时,内核会提前把sa_mask加入到block位图中,默认会把当前信号加入,确保在自定义函数处理过程中,不会再处理不想处理的信号,信号处理函数返回时自动恢复原来的信号屏蔽字
参数:
signum:信号编码
act:设置信号处理方法,输入型参数
oldact:旧的信号处理方法会通过oldact传出,输出型参数
返回值:
0标识成功,-1标识失败
在Linux下,当子进程退出或者暂停时,会向父进程发送SIGCHLD信号,父进程对于SIGCHLD信号的默认处理动作是忽略,但是我们知道,如果父进程不等待回收子进程,子进程会一直保持僵尸状态,进程PCB会保持下来。
但是如果我们想要子进程自己处理完,就退出并且释放自己的资源,父进程不关心子进程的退出结果,要怎么办呢?
可以通过sigaction或者signal修改信号的默认处理动作为SIG_IGN,这样就可以,可见Linux下系统的默认处理动作为忽略和自定义处理动作忽略还是有区别的。
当然这里我们也可以当父进程修改信号自定义处理动作为非阻塞等待,来获取子进程退出的结果,代码如下:
#include <iostream>
#include <signal.h>
#include <unistd.h>
#include <sys/types.h>
#include <wait.h>using namespace std;void handler(int sig)
{cout << "捕捉到:" << sig << endl;int status = 0;pid_t pid = 0;while((pid = waitpid(-1, &status, WNOHANG)) > 0){cout << "child pid" << pid << endl;cout << "!!!!!!!!!!!!" << endl;if(WIFEXITED(status))cout << "退出码为:" << WEXITSTATUS(status) << endl;else if(WIFSIGNALED(status))cout << "终止信号:" << WTERMSIG(status) << endl;}
}// 回收子进程通过信号
int main()
{struct sigaction act;act.sa_handler = handler;sigaction(SIGCHLD, &act, nullptr);// 4. 自定义SIG_IGNsignal(SIGCHLD, SIG_IGN);if(fork() == 0){cout << "child pid" << getpid() << endl;sleep(5);exit(0);}while(true) sleep(1);return 0;
}
完。
相关文章:

Linux-信号执行
1. 信号什么时候被处理 当进程从内核态返回到用户态的时候,进行信号的检测和处理 什么内核态,什么又是用户态呢? 当进程在CPU上运行时,内核态:允许进程访问操作系统的代码和数据,用户态:进程只…...

在线听歌播放器 梨花带雨网页音乐播放器 网页音乐在线听 源码
最新梨花带雨网页音乐播放器二开优化修复美化版全开源版本源码下载 下 载 地 址 : runruncode.com/php/19749.html 梨花带雨播放器基于thinkphp6开发的XPlayerHTML5网页播放器前台控制面板,支持多音乐平台音乐解析。二开内容:修复播放器接口问题&am…...

免费生成证件照
分享分享,免费福利,欢迎大家来体验!!! 不知道你是不是会时不时有使用证件照需求,这一个小程序,可以生成常见尺寸的证件照,全程免费,有需要的可以动动小手,体…...

深入探索数据链路层:网络通信的基石
⭐小白苦学IT的博客主页⭐ ⭐初学者必看:Linux操作系统入门⭐ ⭐代码仓库:Linux代码仓库⭐ ❤关注我一起讨论和学习Linux系统❤ 前言 在网络通信的宏伟世界中,数据链路层扮演着至关重要的角色。它位于物理层和网络层之间,不仅直接…...

STM32使用L9110驱动电机自制小风扇
1.1 介绍: 该电机控制模块采用L9110电机控制芯片。该芯片具有两个TTL/CMOS兼容输入端子,并具有抗干扰特性:具有高电流驱动能力,两个输出端子可直接驱动直流电机,每个输出端口可提供750800mA动态电流,其峰值…...

C语言——队列的实现
队列按照先进先出(FIFO,First In First Out)的原则管理数据。这意味着最先进入队列的元素会被最先移出,类似于排队等候服务的情况。队列通常有两个主要操作:入队(enqueue),将元素添加…...

15-LINUX--线程的创建与同步
一.线程 1.线程的概念 线程是进程内部的一条执行序列或执行路径,一个进程可以包含多条线程。 2.线程的三种实现方式 ◼ 内核级线程:由内核创建,创建开销大,内核能感知到线程的存在 ◼ 用户级线程:线程的创建有用户空…...
【退役之重学Java】如何解决消息持续积压等问题
一、将读写数据库等耗时的操作,从消费者逻辑中抽取出来,专门部署机器去完成这部分操作。...

Linux下的SPI通信
SPI通信 一. 1.SPI简介: SPI 是一种高速,全双工,同步串行总线。 SPI 有主从俩种模式通常由一个主设备和一个或者多个从设备组从。SPI不支持多主机。 SPI通信至少需要四根线,分别是 MISO(主设备数据输入,从设备输出),MOSI (主设数据输出从设备输入),SCLK(时钟信号),CS/SS…...

【转载】数字化工厂规划蓝图报告
制造业进入到全新的数字化时代,需要构建新型智能工厂、数字化工厂与智能车间以助力传统产业智能制造升级,将新一代信息技术贯穿到设计、工艺、生产、物流等各个环节。目的是完善创新体系、提升产品质量、推行绿色制造、增强核心竞争力、发展现代化客户体…...

《基于GNU-Radio和USRP的雷达通信系统的实现》文献阅读
文章目录 前言一、摘要二、引言三、联合系统实施1、基本原理2、实验方案 四、软件设置1、发射机2、接收机 五、实验结果1、实验设置2、波形3、室内外对比4、不同参数的结果 六、结论七、参考文献八、论文自取九、阅读收获 前言 本文记录《基于GNU-Radio和USRP的雷达通信系统的实…...

Sealos急速部署生产用k8s集群
最近一段时间部署k8s全部使用sealos了,整体使用感觉良好,基本没有什么坑。推荐给大家。 使用 Sealos,可以安装一个不包含任何组件的裸 Kubernetes 集群。 最大的好处是提供 99 年证书,用到我跑路是足够了。不用像之前kubeadm安装…...

VTK数据的读写--Vtk学习记录1--《VTK图形图像开发进阶》
读和写操作是VTK可视化管线两端相关的类--Reader和Writer类 Reader:将外部数据读入可视化管线,主要步骤如下 s1:实例化Reader对象 s2:指定所要读取的文件名 s3:调用Update()促使管线执行 对应的Writer: s1:实例化Writer对象 s2输入要写的数据以及指定写入的文…...

Vue3专栏项目 -- 一、第一个页面(下)
一、Dropdown 组件(下拉菜单组件)编码 1、基本功能:展示出下拉按钮和下拉菜单栏的样式 我们可以通过bootstrap来实现这个下拉框,需要注意它这个只是有样式,是没有行为的 然后这个下拉按钮的文字展示是根据用户名称展…...
一栈走天下:使用HBuilderX高效搭建Uni-App微信小程序开发环境
一栈走天下:使用HBuilderX高效搭建Uni-App微信小程序开发环境 Uni-App与HBuilderX简介Uni-App基础HBuilderX介绍 环境搭建步骤步骤1:安装HBuilderX步骤2:创建Uni-App项目步骤3:配置微信小程序平台步骤4:预览与发布 代码…...

docker安装Debian:11 freeswitch1.10.5
文章目录 一、生成一个镜像二、切换一个镜像源为阿里源三、安装一些相关依赖和freeswitch3.1第一步:安装freeswitch-mod和下载所需的依赖项3.2 设置密钥3.3 安装freeswitch所需的依赖项3.4 报错3.4.1 报错13.4.2 报错23.4.3 报错3 四、运行4.1 通话三十秒自动挂断 一…...

c3 笔记6 认识css样式表
<link>与import应该如何选择?事实上,使用link与import链接外部样式文件的效果看起来是一样的,区别在于<link>是HTML标记而import属于CSS语法。<link>标记有rel、type与href属性,可以指定CSS样式表的名称,这样就…...

基于springboot+mybatis+vue的项目实战之增删改查CRUD
目录结构 PeotController.java package com.example.controller;import com.example.pojo.Peot; import com.example.pojo.Result; import com.example.service.PeotService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web…...

字节跳动(社招)四面算法原题
TikTok 进展 又是一期定时汇报 TikTok 进展的推文。 上周,美国总统拜登签署了价值 950 亿美元的一揽子对外援助法案。 该法案涉及强制字节跳动剥离旗下应用 TikTok 美国业务,即 针对 TikTok 非卖即禁的"强抢行为"开始进入九个月(27…...
车道线检测交通信号识别车辆实时检测
系列文章目录 提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加 TODO:写完再整理 文章目录 系列文章目录前言车道线检测机器学习前言 认知有限,望大家多多包涵,有什么问题也希望能够与大家多交流,共同成长! 本文先对车道线检测&交通信号识别&…...
React hook之useRef
React useRef 详解 useRef 是 React 提供的一个 Hook,用于在函数组件中创建可变的引用对象。它在 React 开发中有多种重要用途,下面我将全面详细地介绍它的特性和用法。 基本概念 1. 创建 ref const refContainer useRef(initialValue);initialValu…...

【Oracle APEX开发小技巧12】
有如下需求: 有一个问题反馈页面,要实现在apex页面展示能直观看到反馈时间超过7天未处理的数据,方便管理员及时处理反馈。 我的方法:直接将逻辑写在SQL中,这样可以直接在页面展示 完整代码: SELECTSF.FE…...

Python实现prophet 理论及参数优化
文章目录 Prophet理论及模型参数介绍Python代码完整实现prophet 添加外部数据进行模型优化 之前初步学习prophet的时候,写过一篇简单实现,后期随着对该模型的深入研究,本次记录涉及到prophet 的公式以及参数调优,从公式可以更直观…...

Redis数据倾斜问题解决
Redis 数据倾斜问题解析与解决方案 什么是 Redis 数据倾斜 Redis 数据倾斜指的是在 Redis 集群中,部分节点存储的数据量或访问量远高于其他节点,导致这些节点负载过高,影响整体性能。 数据倾斜的主要表现 部分节点内存使用率远高于其他节…...

论文阅读笔记——Muffin: Testing Deep Learning Libraries via Neural Architecture Fuzzing
Muffin 论文 现有方法 CRADLE 和 LEMON,依赖模型推理阶段输出进行差分测试,但在训练阶段是不可行的,因为训练阶段直到最后才有固定输出,中间过程是不断变化的。API 库覆盖低,因为各个 API 都是在各种具体场景下使用。…...

小智AI+MCP
什么是小智AI和MCP 如果还不清楚的先看往期文章 手搓小智AI聊天机器人 MCP 深度解析:AI 的USB接口 如何使用小智MCP 1.刷支持mcp的小智固件 2.下载官方MCP的示例代码 Github:https://github.com/78/mcp-calculator 安这个步骤执行 其中MCP_ENDPOI…...
验证redis数据结构
一、功能验证 1.验证redis的数据结构(如字符串、列表、哈希、集合、有序集合等)是否按照预期工作。 2、常见的数据结构验证方法: ①字符串(string) 测试基本操作 set、get、incr、decr 验证字符串的长度和内容是否正…...

项目进度管理软件是什么?项目进度管理软件有哪些核心功能?
无论是建筑施工、软件开发,还是市场营销活动,项目往往涉及多个团队、大量资源和严格的时间表。如果没有一个系统化的工具来跟踪和管理这些元素,项目很容易陷入混乱,导致进度延误、成本超支,甚至失败。 项目进度管理软…...
Oracle实用参考(13)——Oracle for Linux物理DG环境搭建(2)
13.2. Oracle for Linux物理DG环境搭建 Oracle 数据库的DataGuard技术方案,业界也称为DG,其在数据库高可用、容灾及负载分离等方面,都有着非常广泛的应用,对此,前面相关章节已做过较为详尽的讲解,此处不再赘述。 需要说明的是, DG方案又分为物理DG和逻辑DG,两者的搭建…...

代理服务器-LVS的3种模式与调度算法
作者介绍:简历上没有一个精通的运维工程师。请点击上方的蓝色《运维小路》关注我,下面的思维导图也是预计更新的内容和当前进度(不定时更新)。 我们上一章介绍了Web服务器,其中以Nginx为主,本章我们来讲解几个代理软件:…...