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

Linux进程信号产生以及捕捉

一.什么是信号

生活中,有哪些信号相关的场景呢,比如:红绿灯,闹钟,转向灯等等

1.这里我们要知道,你为什么认识这些信号呢,记住了对应场景下的信号+后续是有”动作“要你执行的

2.我们在我们的大脑中,能够识别这个信号的

3.如果特定信号没有产生,但是我们依旧知道应该如何处理这个信号

4.我在收到这个信号的时候,可能不会立即处理这个信号

5.信号本身,在我们无法立即被处理的时候,也一定要先被临时的记住

 结论:什么是Linux信号,本质是一种通知机制,用户or操作系统通过发送一定的信号,通知进程,某些事件已经发生,你可以在后续进行处理。

二.信号如何使用,结合进程,信号结论

1.进程要处理信号,必须具备信号“识别”的能力(看到+处理动作)

2.凭什么进程能够“识别”信号呢,代码是程序员编写的,就比如说你是如何认识红绿灯的,这都是有人告诉你的

3.信号产生是随机的,进程可能正在忙自己的事情,所以,信号的后续处理,可能不是立即处理的

4.进程会临时的记录下对应的信号,方便后续进行处理

5. 在什么时候处理呢,合适的时候(这个后面会说)

6.一般而言,信号的产生相对于进程而言是异步的(什么是异步呢,异步双方不需要共同的时间,也就是接收方不知道发送方什么时候发送,所以在发送的信息中就要有提示接收方开始接收的信息,如开始时有开始位,同时在结束时有停止位。)

三.信号常见的处理方式

1.默认(进程自带的,程序员写好的逻辑)

2.忽略(信号的一种处理方式)

3.自定义动作(捕捉信号)

四.常见信号

 1-31普通信号,34-64实时信号。

如何理解组合键变信号:键盘的工作方式是通过:中断方式进行的,当然也能够识别组合键,ctrl+c,OS解释组合键->查找进程列表->前台运行的进程->OS写入对应的信号到进程内部的位图结构中。 

如何理解信号被进程保存:进程必须具有保存信号的相关数据结构(位图,unisgned int)PCB内部保存了信号位图字段。

如何理解信号发送的本质:信号位图是在task_struct -> task_struct内核数据结构->OS。

信号发送的本质:OS向目标进程写信号,OS直接修改pcb中的指定的位图结构完成“发送”信号的过程。

五.信号的产生以及核心转储

 键盘产生信号

 sighandler_t handler回调函数,通过回调的方式,修改对应信号的捕捉方法,signum,要捕捉信号的名称或编号。

#include<iostream>
#include<signal.h>
#include<unistd.h>
#include<sys/types.h>
using namespace std;void cating(int signum)
{cout<<"捕捉到信号:"<<signum<<endl;return;
}int main()
{signal(2,cating);while(1)sleep(1);return 0;
}

signal(SIGINT,catchsig),特定信号的处理动作,一般只有一个,signal函数,仅仅是修改进程对特定信号的后续处理动作,不是直接调用对应的处理动作,如果后续没有任何SIGINT信号产生,catchsig永远也不会被调用。

核心转储

man 7 signal 查看信号的默认处理行为。这里不同信号的Action不同,有Term、Core、Ign、Cont、Stop等状态行为。

接下来就是了解一下Core动作——核心转储(一般而言云服务器的核心转储功能是被关闭的)。关于进程等待中,status 中如果是正常终止就保存返回值、错误码。

如果被信号所杀,第7位上保存的这个就叫做core dump,如果是0表示没有发生核心转储,为1则是发生了核心转储。我们可以打印code_dump位的信息 (左移7位然后与上1即可)。 

#include<iostream>
#include<signal.h>
#include<unistd.h>
#include<sys/types.h>
using namespace std;void cating(int signum)
{cout<<"捕捉到信号:"<<signum<<endl;return;
}
int main()
{pid_t id = fork();if (id == 0){sleep(1);int a = 100;a /= 0;exit(0);}int status = 0;waitpid(id, &status, 0);cout << "父进程:" << getpid() << "子进程:" << getppid() << endl;//退出信号:cout << "exit sig" << (status & 0x7f) << endl;// 打印core dump位cout << "core dump" << (status > 7 & 1) << endl;
}

如果核心转储是被关闭的,可以使用ulimit -a查看,ulimit -c10240打开,这里就可以使用core.11077就可以定位错误。

系统调用发送信号 

 第一个参数为指定的进程pid,第二个参数为对应的信号编码。

kill 是给指定进程发送信号,而如果想让自己给自己发信号,可以使用 raise 命令

给自己发送abort信号,也就是6号信号。相当于代码:raise(6) 或  kill(getpid(),6)

软件条件产生信号

这里可以举一个例子:当管道,读端不进行读取,还关闭了文件描述符,而写端一直写入,会发生什么问题?操作系统会自动终止对应写端进程,通过发送信号的方式,发送SIGPIPE信号。

 验证:

1.创建匿名管道

2.让父进程进行读取,子进程进行写入

3.让父进程关闭读端 && waitpid(),子进程一直进行写入

4.子进程退出,父进程waitpid拿到子进程的退出status。

5.提取退出信号。

SIGPIPE便是一种软件条件产生的信号,除了管道中会发出SIGPIPE信号,接下来我们学习其它软件产生的信号,alarm 函数与SIGALRM 信号,系统调用中的 alarm 函数会产生 SIGALRM  信号。接下来让我们了解一下 alarm 接口。

调用 alarm 函数可以设定一个闹钟,也就是告诉内核再 seconds 秒之后给当前进程发 SIGALRM 信号,该信号的默认处理动作是终止当前进程。 

利用上面这个函数,我们可以做一个定时器。

int count = 0;void catchSig(int signum)
{cout << "count: " << count << endl;
}
int main()
{// 1秒后发送消息alarm(1);signal(SIGALRM, catchSig);while (1){++count;}return 0;
}

如何理解软件条件给进程发送信号OS先识别到某种软件条件触发或不满足。OS构建信号,发送给指定的进程。

 硬件异常产生信号

 首先我们要知道硬件是如何产生信号的,我们先写一段整数除以0的代码看一下。

void handler(int signum)
{sleep(1);cout << "signal is : " << signum << endl;
}
int main()
{signal(SIGFPE, handler);int a;a/=0;while (1)sleep(1);return 0;
}

这段代码会不断的产生信号8,但是我们把信号8捕捉了,他就会不停的发送。

一.那如何理解整数除以0这个操作

1.因为计算的是CPU,如果CPU计算出现错误,会将错误信息放入到状态寄存器中,状态寄存器中有对应的状态标记位(类比成 位图),其中会存在溢出标记位,OS会自动进行计算完毕之后的检查。
2.如果OS识别到有溢出问题,根据 current指针(指向当前正在运行的进程) 找到进程,然后提取出 PID,O S再进行信号发送到该进程,进程则会再合适的时候,进行信号的处理。
3.立即找到当前 task_struct中有一个current指针,当程序进行执行时,current内的内容也会被加载到CPU的寄存器中。
4.所以,整数除以零是一个硬件异常的问题。

二·.那一旦出现硬件异常,进程一定会退出吗?

不一定,一般默认是退出,但是如果我们不进行退出,我们也不能进行任何操作,因为无权访问CPU中的寄存器数据。

三.为什么会发生死循环?

因为寄存器中的异常一直没有被解决,所以一般我们出现除0等错误,一般就直接exit()退出了。

指针越界、野指针一般被称为段错误 (11号信号SIGSEGV)

那如何理解野指针或越界问题?

1.都必须通过地址,找到目标位置,
2.语言上的地址,全部都是虚拟地址
3.将虚拟地址转化为物理地址
4.页表+MMU(Memmory Manager Unit——硬件)
5.野指针,越界->非法地址->MMU转化的时候,一定会报错。因为MMU这个硬件其中也有寄存器,注意,外设也有寄存器的,不只是CPU有寄存器。

 结论:硬件也能产生信号。所有的信号,都有其来源,但最终全部都是被OS被识别、解释、发送的。

信号的常见问题

为什么所有的信号产生,最终都要由OS来执行?
因为OS是进程的管理者。

信号的处理是否是立即处理的?
由OS在合适的时机进行处理。

信号如果不是被立即处理,那么信号是否需要暂时被进程记录下来?记录在哪里?
需要被记录下来,记录在进程PCB中对应的信号记录位图。

如何理解OS向进程发送信号?
本质是OS直接修改PCB中的信号位图,根据信号编号修改特定的比特位(由0置1)。

相关文章:

Linux进程信号产生以及捕捉

一.什么是信号 生活中&#xff0c;有哪些信号相关的场景呢&#xff0c;比如&#xff1a;红绿灯&#xff0c;闹钟&#xff0c;转向灯等等 1.这里我们要知道&#xff0c;你为什么认识这些信号呢&#xff0c;记住了对应场景下的信号&#xff0b;后续是有”动作“要你执行的 2.我们…...

11. GLSL(OpenGL Shader Language)常用知识点汇总

1. 说明&#xff1a; 在使用OPenGL进行三维模型渲染时&#xff0c;需要使用到两个着色器对模型进行位置设置和颜色设置&#xff0c;分别为顶点着色器和片段着色器&#xff0c;这两个着色器是使用 GLSL 语法进行编写的。这篇文章总结了一些GLSL中的一些基本语法知识。 2. 基本…...

转发一张网络工程师考试的试卷2021.5.15

网络工程师考试 单选题 &#xff08;30题&#xff0c;每题1分&#xff0c;共30分&#xff09; 1. 你在一个网络中实现DHCP服务&#xff0c;配置一些计算机成为DHCP客户端&#xff0c;由于工作需要&#xff0c;一台系统为Windows 10 的客户端要把从DHCP服务器获得的地址释放&a…...

AMD发布23.2.1 新驱动 支持开年新作《魔咒之地》

如果说2023年有什么新作&#xff0c;《魔咒之地&#xff08;Forspoken&#xff09;》当属开年大作之一&#xff0c;1月25日才在steam平台发售。虽然开售后的表现似乎不如想象中优秀&#xff0c;加之价格相对昂贵&#xff0c;令不少玩家望而却步&#xff0c;但如果只是想尝鲜&am…...

开放平台如何做接口的签名和加解密?

目录安全性功能介绍实现流程开放平台依赖代码AES加解密工具类PlatformConfigRequestUtilsPlatformServiceCommonCodeZuulFilterHelperServerResponsePlatformContactRsaSignatureRsaUtilsStreamUtil开放平台-解密过滤器开放平台-加密过滤器调用方代码公共代码Get-DemoPost-Demo…...

Mr. Cappuccino的第40杯咖啡——Kubernetes之Pod生命周期

Kubernetes之Pod生命周期Pod生命周期官方文档Pod的状态初始化容器案例钩子函数Exec命令TCPSocketHTTPGet案例容器探测Exec命令TCPSocketHTTPGet探测时间重启策略Pod生命周期官方文档 Pod生命周期官方文档 Pod的状态 pending&#xff1a;挂起&#xff0c;apiserver创建了pod资…...

记一次OOM

1,问题描述&#xff1a; 新上了一版代码之后&#xff0c;上游服务请求我们服务失败&#xff0c;报错&#xff1a;“服务不可用”&#xff0c;发现注册中心上服务掉线&#xff0c;查询日志&#xff1a;发现oom&#xff1a;Java heap space,GC overhead limit exceeded。 容易…...

idea插件生成dao类service类controller类以及mapper.xml

idea插件生成dao类service类controller类以及mapper.xml 安装插件Easycode和MybatisX&#xff0c;不用自己写代码 1.Files——》Settings——》Plugins&#xff0c;分别搜索Easycode和MybatisX&#xff0c;点击下载。 2.新建一个springboot模板&#xff0c;选择的依赖如下 3.…...

DML 数据操作语言

概述 DML英文全称是Data Manipulation Language(数据操作语言)&#xff0c;用来对数据库中表的数据记录进行增、删、改操作。 添加数据&#xff08;INSERT&#xff09;修改数据&#xff08;UPDATE&#xff09;删除数据&#xff08;DELETE&#xff09; 添加数据 1、给指定字段…...

PySpark实战一之入门

1、PySpark的编程模型 分三个模块&#xff1a; 数据输入&#xff1a;通过SparkContext对象&#xff0c;完成数据输入 数据处理计算&#xff1a;输入数据后得到RDD对象&#xff0c;对RDD对象的成员方法进行迭代计算 数据输出&#xff1a;最后通过RDD对象的成员方法&#xff0…...

【DockerCE】Docker-CE 23.0.1正式版发布

很意外啊&#xff01;Docker社区版竟然直接从20.xx.xx版本&#xff0c;升级到23.xx.xx版本了。官网地址&#xff08;For RHEL/CentOS 7.9&#xff09;&#xff1a;https://download.docker.com/linux/centos/7/x86_64/stable/Packages/23.0.1版本官方安装包如下&#xff1a;# l…...

vscode开发的Vue家用电器维修服务系统nodejs+mysql

主要功能包括管理员&#xff1a;首页、个人中心、用户管理、维修员管理、维修信息管理、维修申请管理、维修处理管理、家电类别管理、配件信息管理、配件领用管理、维修结果管理、家电维修知识管理、公告信息管理、留言板管理&#xff0c;用户&#xff1a;首页、个人中心、维修…...

PyQt5数据库开发1 4.2 配置SQL Server 2008 数据源(ODBC编程)

文章目录 配置SQL Server 2008 数据源&#xff08;ODBC编程&#xff09; 1. 了解要配置的数据源服务器名称&#xff0c;以及数据库和对应表 2. 打开控制面板&#xff0c;点击管理工具 3. 双击数据源 4. 选择“用户DSN”选项卡&#xff0c;点击“添加” 5. 选择SQL Serv…...

【JavaEE】多线程代码实例:单例模式与阻塞队列BlockingQueue

目录 单例模式&#xff1a; 什么是单例模式&#xff1f; 单例模式的实现方式&#xff1a; 饿汉模式&#xff1a; 懒汉模式&#xff1a; 基于并发编程对单例模式线程安全问题的讨论&#xff1a; 阻塞队列&#xff1a; 标准库中的阻塞队列&#xff1a; 自实现阻塞…...

算法思想 - 搜索算法

本文主要介绍算法中搜索算法的思想&#xff0c;主要包含BFS&#xff0c;DFS。搜索相关题目深度优先搜索和广度优先搜索广泛运用于树和图中&#xff0c;但是它们的应用远远不止如此。BFS广度优先搜索的搜索过程有点像一层一层地进行遍历&#xff0c;每层遍历都以上一层遍历的结果…...

C#底层库--日期扩展类(上周、本周、明年、前年等)

系列文章 C#底层库–记录日志帮助类 本文链接&#xff1a;https://blog.csdn.net/youcheng_ge/article/details/124187709 C#底层库–数据库访问帮助类&#xff08;MySQL版&#xff09; 本文链接&#xff1a;https://blog.csdn.net/youcheng_ge/article/details/126886379 …...

如何在 Webpack 中开启图片压缩

工具对比 npmtrends.com/image-minim… 这四个压缩工具&#xff0c;从下载量来看&#xff0c;image-webpack-loader 较多&#xff0c;image-minimizer-webpack-plugin、imagemin-webpack-plugin 次之&#xff0c;imagemin-webpack 已经不再维护&#xff0c;因此不考虑此工具。 …...

Web-Filter

## 今日内容 1. Filter&#xff1a;过滤器 2. Listener&#xff1a;监听器 # Filter&#xff1a;过滤器 1. 概念&#xff1a; * 生活中的过滤器&#xff1a;净水器,空气净化器&#xff0c;土匪、 * web中的过滤器&#xff1a;当访问服务器的资源时…...

测试写文章自动保存

近日恰逢双十一,瞅了瞅自己干瘪的钱包,没忍心入手期待已久的 macPro,只好在虚拟机里玩一下 mac好了,等以后钱包傲气的时候再来个真实的。 安装环境: windows10 VMWare14.2 2018-7-28 小嘚瑟补充:唧唧歪歪大半年,一夜回到解放前,终于剁手整了个真机,可以折腾一下了 ——…...

云平台搭建实例

嗨嗨&#xff0c;每天一更是不是很奈斯&#xff1f;我也觉得&#xff0c;昨天晚上我学校的老师借一天一千的设备&#xff0c;只能用七天&#xff0c;所以我拿出来给你们没有设备和刚用设备的看看吧。操作&#xff1a;首先我们将云平台安装好后&#xff0c;插上网线&#xff0c;…...

AI视频修复与画质增强完全指南:从低清到高清的视频优化解决方案

AI视频修复与画质增强完全指南&#xff1a;从低清到高清的视频优化解决方案 【免费下载链接】video2x A lossless video/GIF/image upscaler achieved with waifu2x, Anime4K, SRMD and RealSR. Started in Hack the Valley II, 2018. 项目地址: https://gitcode.com/GitHub_…...

5大突破!漫画阅读工具Venera重构跨平台阅读体验

5大突破&#xff01;漫画阅读工具Venera重构跨平台阅读体验 【免费下载链接】venera A comic app 项目地址: https://gitcode.com/gh_mirrors/ve/venera 副标题&#xff1a;如何在Windows、macOS和移动设备间无缝切换你的漫画库&#xff1f; 开篇痛点引入 不同设备间漫…...

Pixelorama扩展深度解析:3种自动化精灵图切割方案对比

Pixelorama扩展深度解析&#xff1a;3种自动化精灵图切割方案对比 【免费下载链接】Pixelorama A free & open-source 2D sprite editor, made with the Godot Engine! Available on Windows, Linux, macOS and the Web! 项目地址: https://gitcode.com/gh_mirrors/pi/Pi…...

2026最新Java金三银四面试参考指南公开!

想必有很多小伙伴这会已经在为金三银四面试跳槽做准备了。临近面试肯定是要想办法提升自己的面试能力&#xff0c;这个时候如果还去一昧地提升自己的代码能力对面试是毫无帮助的。大多数人在面试的时候都会遇到以下几种情况&#xff08;大家可以看看自己中了几个&#xff09;&a…...

AS3935闪电传感器Arduino驱动库深度解析与工业级应用

1. 项目概述AS3935 是一款由 AMS&#xff08;现为 ams OSRAM&#xff09;推出的专用闪电检测传感器芯片&#xff0c;集成 RF 前端、数字信号处理器&#xff08;DSP&#xff09;、闪电算法引擎及 IC/SPI 接口&#xff0c;可实现对 40 km 范围内云地闪&#xff08;CG&#xff09;…...

Java大厂面试实战:电商高并发场景下的Spring Boot+Redis+Kafka技术栈深度解析

Java大厂面试实战&#xff1a;电商高并发场景下的技术栈深度解析 前言 在互联网大厂面试中&#xff0c;技术面试官往往会结合具体业务场景来考察候选人的技术深度和广度。本文模拟了一场电商场景下的Java技术面试&#xff0c;通过面试官与求职者"谢飞机"的三轮对话&a…...

2025年雀魂Mod工具终极指南:从痛点分析到实践探索

2025年雀魂Mod工具终极指南&#xff1a;从痛点分析到实践探索 【免费下载链接】majsoul_mod_plus 雀魂解锁全角色、皮肤、装扮等&#xff0c;支持全部服务器。 项目地址: https://gitcode.com/gh_mirrors/ma/majsoul_mod_plus 在雀魂游戏体验中&#xff0c;你是否曾因角…...

【开题答辩全过程】以 基于大数据的智能推送系统设计与实现为例,包含答辩的问题和答案

个人简介一名14年经验的资深毕设内行人&#xff0c;语言擅长Java、php、微信小程序、Python、Golang、安卓Android等开发项目包括大数据、深度学习、网站、小程序、安卓、算法。平常会做一些项目定制化开发、代码讲解、答辩教学、文档编写、也懂一些降重方面的技巧。感谢大家的…...

终极Windows音频路由指南:如何实现多设备音频分离的专业方案

终极Windows音频路由指南&#xff1a;如何实现多设备音频分离的专业方案 【免费下载链接】audio-router Routes audio from programs to different audio devices. 项目地址: https://gitcode.com/gh_mirrors/au/audio-router 你是否曾经遇到过这样的困扰&#xff1a;想…...

告别混乱:我是如何用Hugo + GitHub Actions实现博客自动化构建与发布的

告别混乱&#xff1a;我是如何用Hugo GitHub Actions实现博客自动化构建与发布的 去年我的博客还处于"石器时代"——每次写完文章都要手动执行hugo build&#xff0c;再把public文件夹里的文件拖到服务器。直到某天连续三次忘记更新CNAME文件导致域名解析失败&#…...