当前位置: 首页 > 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:写完再整理 文章目录 系列文章目录前言车道线检测机器学习前言 认知有限,望大家多多包涵,有什么问题也希望能够与大家多交流,共同成长! 本文先对车道线检测&交通信号识别&…...

Adafruit Bluefruit LE模块AT命令实战:从BLE透传到Eddystone信标与HID设备开发

1. 项目概述与核心价值如果你正在开发一个需要无线连接功能的物联网设备、可穿戴设备或者创意交互项目&#xff0c;那么蓝牙低功耗&#xff08;BLE&#xff09;技术几乎是一个绕不开的选择。它功耗低、连接快&#xff0c;并且被现代智能手机和电脑广泛支持。然而&#xff0c;直…...

Cursor AI计算器:无缝集成开发工作流的智能计算解决方案

1. 项目概述&#xff1a;一个为开发者量身定制的光标计算器最近在GitHub上看到一个挺有意思的项目&#xff0c;叫kingdomseed/cursor-calculator。光看名字&#xff0c;你可能会想&#xff0c;这不就是个计算器吗&#xff1f;有什么好说的。但如果你是一个深度依赖代码编辑器&a…...

如何评估拓客数据的有效性?避开无效内耗,精准提效

当下企业拓客越来越注重精细化&#xff0c;不少团队投入大量精力收集数据&#xff0c;却陷入“数据越多&#xff0c;效果越差”的困境——空号、无效线索、非目标客群占据大半&#xff0c;不仅浪费人力成本&#xff0c;更拖慢增长节奏。其实&#xff0c;拓客的核心不在于“量”…...

终极指南:Spring事务传播机制详解——7种行为+实战案例

终极指南&#xff1a;Spring事务传播机制详解——7种行为实战案例 【免费下载链接】CodeGuide :books: 本代码库是作者小傅哥多年从事一线互联网 Java 开发的学习历程技术汇总&#xff0c;旨在为大家提供一个清晰详细的学习教程&#xff0c;侧重点更倾向编写Java核心内容。如果…...

如何高效管理命令历史:yargs readline功能的终极指南

如何高效管理命令历史&#xff1a;yargs readline功能的终极指南 【免费下载链接】yargs yargs the modern, pirate-themed successor to optimist. 项目地址: https://gitcode.com/gh_mirrors/ya/yargs 在现代命令行工具开发中&#xff0c;提供流畅的用户交互体验至关…...

终极营销自动化工作流设计:工程师如何构建高效营销流程

终极营销自动化工作流设计&#xff1a;工程师如何构建高效营销流程 【免费下载链接】Marketing-for-Engineers A curated collection of marketing articles & tools to grow your product. 项目地址: https://gitcode.com/gh_mirrors/ma/Marketing-for-Engineers …...

告别手动标注!用TableBank数据集+Detectron2,快速搞定表格检测模型训练

零基础实战&#xff1a;基于TableBank与Detectron2的工业级表格检测方案 在金融报表解析、医疗档案数字化等场景中&#xff0c;表格检测作为文档智能处理的第一道关卡&#xff0c;其准确性直接影响后续信息提取的成败。传统人工标注数据的方式不仅成本高昂&#xff0c;更面临版…...

LEANN:基于选择性重计算的本地向量检索,实现97%存储压缩

1. 项目概述&#xff1a;LEANN&#xff0c;一个重新定义本地向量检索的开源项目如果你和我一样&#xff0c;对当前AI应用生态里动辄需要将个人数据上传到云端、依赖昂贵且臃肿的向量数据库感到厌倦&#xff0c;那么LEANN的出现&#xff0c;绝对会让你眼前一亮。这不仅仅是一个工…...

突破性创新:Midscene.js如何用AI视觉驱动重塑跨平台自动化测试

突破性创新&#xff1a;Midscene.js如何用AI视觉驱动重塑跨平台自动化测试 【免费下载链接】midscene AI-powered, vision-driven UI automation for every platform. 项目地址: https://gitcode.com/GitHub_Trending/mid/midscene 在当今复杂的软件生态中&#xff0c;跨…...

CPU Cache初始化:从硬件复位到软件使能的底层原理与工程实践

1. 项目概述&#xff1a;从开机到高速缓存就绪当按下电脑的电源键&#xff0c;屏幕上开始跑起一行行代码时&#xff0c;我们看到的通常是BIOS自检、操作系统加载的宏大叙事。但在这背后&#xff0c;有一个对性能影响巨大却又极其低调的“幕后英雄”正在悄然启动&#xff0c;它就…...