当前位置: 首页 > news >正文

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. 信号什么时候被处理 当进程从内核态返回到用户态的时候&#xff0c;进行信号的检测和处理 什么内核态&#xff0c;什么又是用户态呢&#xff1f; 当进程在CPU上运行时&#xff0c;内核态&#xff1a;允许进程访问操作系统的代码和数据&#xff0c;用户态&#xff1a;进程只…...

在线听歌播放器 梨花带雨网页音乐播放器 网页音乐在线听 源码

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

免费生成证件照

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

深入探索数据链路层:网络通信的基石

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

STM32使用L9110驱动电机自制小风扇

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

C语言——队列的实现

队列按照先进先出&#xff08;FIFO&#xff0c;First In First Out&#xff09;的原则管理数据。这意味着最先进入队列的元素会被最先移出&#xff0c;类似于排队等候服务的情况。队列通常有两个主要操作&#xff1a;入队&#xff08;enqueue&#xff09;&#xff0c;将元素添加…...

15-LINUX--线程的创建与同步

一.线程 1.线程的概念 线程是进程内部的一条执行序列或执行路径&#xff0c;一个进程可以包含多条线程。 2.线程的三种实现方式 ◼ 内核级线程&#xff1a;由内核创建&#xff0c;创建开销大&#xff0c;内核能感知到线程的存在 ◼ 用户级线程&#xff1a;线程的创建有用户空…...

【退役之重学Java】如何解决消息持续积压等问题

一、将读写数据库等耗时的操作&#xff0c;从消费者逻辑中抽取出来&#xff0c;专门部署机器去完成这部分操作。...

Linux下的SPI通信

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

【转载】数字化工厂规划蓝图报告

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

《基于GNU-Radio和USRP的雷达通信系统的实现》文献阅读

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

Sealos急速部署生产用k8s集群

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

VTK数据的读写--Vtk学习记录1--《VTK图形图像开发进阶》

读和写操作是VTK可视化管线两端相关的类--Reader和Writer类 Reader:将外部数据读入可视化管线&#xff0c;主要步骤如下 s1:实例化Reader对象 s2:指定所要读取的文件名 s3:调用Update()促使管线执行 对应的Writer: s1:实例化Writer对象 s2输入要写的数据以及指定写入的文…...

Vue3专栏项目 -- 一、第一个页面(下)

一、Dropdown 组件&#xff08;下拉菜单组件&#xff09;编码 1、基本功能&#xff1a;展示出下拉按钮和下拉菜单栏的样式 我们可以通过bootstrap来实现这个下拉框&#xff0c;需要注意它这个只是有样式&#xff0c;是没有行为的 然后这个下拉按钮的文字展示是根据用户名称展…...

一栈走天下:使用HBuilderX高效搭建Uni-App微信小程序开发环境

一栈走天下&#xff1a;使用HBuilderX高效搭建Uni-App微信小程序开发环境 Uni-App与HBuilderX简介Uni-App基础HBuilderX介绍 环境搭建步骤步骤1&#xff1a;安装HBuilderX步骤2&#xff1a;创建Uni-App项目步骤3&#xff1a;配置微信小程序平台步骤4&#xff1a;预览与发布 代码…...

docker安装Debian:11 freeswitch1.10.5

文章目录 一、生成一个镜像二、切换一个镜像源为阿里源三、安装一些相关依赖和freeswitch3.1第一步&#xff1a;安装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应该如何选择?事实上&#xff0c;使用link与import链接外部样式文件的效果看起来是一样的&#xff0c;区别在于<link>是HTML标记而import属于CSS语法。<link>标记有rel、type与href属性&#xff0c;可以指定CSS样式表的名称&#xff0c;这样就…...

基于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 进展的推文。 上周&#xff0c;美国总统拜登签署了价值 950 亿美元的一揽子对外援助法案。 该法案涉及强制字节跳动剥离旗下应用 TikTok 美国业务&#xff0c;即 针对 TikTok 非卖即禁的"强抢行为"开始进入九个月&#xff08;27…...

车道线检测交通信号识别车辆实时检测

系列文章目录 提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加 TODO:写完再整理 文章目录 系列文章目录前言车道线检测机器学习前言 认知有限,望大家多多包涵,有什么问题也希望能够与大家多交流,共同成长! 本文先对车道线检测&交通信号识别&…...

为什么需要建设工程项目管理?工程项目管理有哪些亮点功能?

在建筑行业&#xff0c;项目管理的重要性不言而喻。随着工程规模的扩大、技术复杂度的提升&#xff0c;传统的管理模式已经难以满足现代工程的需求。过去&#xff0c;许多企业依赖手工记录、口头沟通和分散的信息管理&#xff0c;导致效率低下、成本失控、风险频发。例如&#…...

Python实现prophet 理论及参数优化

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

跨链模式:多链互操作架构与性能扩展方案

跨链模式&#xff1a;多链互操作架构与性能扩展方案 ——构建下一代区块链互联网的技术基石 一、跨链架构的核心范式演进 1. 分层协议栈&#xff1a;模块化解耦设计 现代跨链系统采用分层协议栈实现灵活扩展&#xff08;H2Cross架构&#xff09;&#xff1a; 适配层&#xf…...

C++八股 —— 单例模式

文章目录 1. 基本概念2. 设计要点3. 实现方式4. 详解懒汉模式 1. 基本概念 线程安全&#xff08;Thread Safety&#xff09; 线程安全是指在多线程环境下&#xff0c;某个函数、类或代码片段能够被多个线程同时调用时&#xff0c;仍能保证数据的一致性和逻辑的正确性&#xf…...

图表类系列各种样式PPT模版分享

图标图表系列PPT模版&#xff0c;柱状图PPT模版&#xff0c;线状图PPT模版&#xff0c;折线图PPT模版&#xff0c;饼状图PPT模版&#xff0c;雷达图PPT模版&#xff0c;树状图PPT模版 图表类系列各种样式PPT模版分享&#xff1a;图表系列PPT模板https://pan.quark.cn/s/20d40aa…...

AGain DB和倍数增益的关系

我在设置一款索尼CMOS芯片时&#xff0c;Again增益0db变化为6DB&#xff0c;画面的变化只有2倍DN的增益&#xff0c;比如10变为20。 这与dB和线性增益的关系以及传感器处理流程有关。以下是具体原因分析&#xff1a; 1. dB与线性增益的换算关系 6dB对应的理论线性增益应为&…...

打手机检测算法AI智能分析网关V4守护公共/工业/医疗等多场景安全应用

一、方案背景​ 在现代生产与生活场景中&#xff0c;如工厂高危作业区、医院手术室、公共场景等&#xff0c;人员违规打手机的行为潜藏着巨大风险。传统依靠人工巡查的监管方式&#xff0c;存在效率低、覆盖面不足、判断主观性强等问题&#xff0c;难以满足对人员打手机行为精…...

(一)单例模式

一、前言 单例模式属于六大创建型模式,即在软件设计过程中,主要关注创建对象的结果,并不关心创建对象的过程及细节。创建型设计模式将类对象的实例化过程进行抽象化接口设计,从而隐藏了类对象的实例是如何被创建的,封装了软件系统使用的具体对象类型。 六大创建型模式包括…...

掌握 HTTP 请求:理解 cURL GET 语法

cURL 是一个强大的命令行工具&#xff0c;用于发送 HTTP 请求和与 Web 服务器交互。在 Web 开发和测试中&#xff0c;cURL 经常用于发送 GET 请求来获取服务器资源。本文将详细介绍 cURL GET 请求的语法和使用方法。 一、cURL 基本概念 cURL 是 "Client URL" 的缩写…...

微服务通信安全:深入解析mTLS的原理与实践

&#x1f525;「炎码工坊」技术弹药已装填&#xff01; 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 一、引言&#xff1a;微服务时代的通信安全挑战 随着云原生和微服务架构的普及&#xff0c;服务间的通信安全成为系统设计的核心议题。传统的单体架构中&…...