进程信号之产生

news2025/1/19 8:18:48

目录

🏆一、认识信号

🏆二、信号的产生

①通过终端按键产生信号

②调用系统函数向进程发信号

③由硬件异常产生信号

④软件条件产生信号

🏆三、进程退出时的核心转储的问题

🏆一、认识信号

生活中,有很多信号提示我们做出反应,比如发令枪提示我们要开跑了,闹钟提醒我们该起床了,红绿灯绿灯提示我们可以通过马路,当手机电量比较低时会提示我们低电量,手机铃声提示我们有来电。这些都可以算作是信号,不过我们识别这些指示后产生行为。而认识-->行为产生就是针对信号的一个基本逻辑。OS中的信号就是首先要能识别信号,然后根据信号做出相应的动作。

首先声明信号和信号量没有任何关系。那么当前OS可以识别的信号有哪些呢?

使用kill -l 指令查看当前系统支持的信号:

 通过查看信号,发现没有0号、32号、33号信号。只有1-31、34-64各自31个信号

其中把1号到31号信号叫做普通信号34号到64号信号叫做实时信号。我们只谈前31种信号。

我们首先要说明,信号是给进程发送的,当信号到来的时候,我们不一定立马处理这个信号,因为我们进程可能正在处理其他事务。信号可以随时产生,它和进程是异步的,而进程可能正在处理其他事务说明我们进程收到信号时会保存信号,然后再处理信号。这就是了解掌握信号的一个逻辑。画一条线,就是:

 如果一个信号是发给进程的,而进程要保存信号,那么应该保存在哪里呢?没错,保存在task_struct.普通信号有1-31号,那么很明显,又是一种位图的思想来保存信号。

unsigned int 32个比特位,而普通信号有31种,是够我们来保存的,用比特位的位置,代表信号编号 ;比特位的内容,代表是否受到该信号,0表示没有,1表示有。

发送信号的本质就是修改pcb中的信号位图!而它是内核维护的数据结构对象。PCB的管理者是OS,所以本质是OS向目标进程发送信号

信号处理又是如何做的呢?

信号的处理动作有三种:

1、忽略此信号。

2、执行该信号的默认处理动作。

3、提供一个信号处理函数,要求内核在处理该信号时切换到用户态执行这个处理函数,这种方式称为捕捉(Catch)一个信号。

这三种处理方式俗称忽略,默认和自定义处理

举个例子可能会更加通俗易懂一些。

我们Linux上在运行可执行程序时,通常使用ctrl+c来终止前台进程。这是一个用来终止前台进程的热键,本质上ctrl+c是一个组合键,OS将其解释为2号信号--SIGINT.

 interrupt from keyboard 意为通过键盘终止进程。

这里介绍OS提供的接口signal

signum:信号编号

handler:这是一个函数指针类型,回调函数。 

signal()函数的意义在于对于指定信号,设置一个自定义动作,自定义动作通过回调函数handler

它是信号处理的接口,对应的是自定义动作。

有了这个接口,我们便可以验证我们说的ctrl+c 这个热键是2号信号。

针对ctrl+c 设置一个自定义动作。

 

 上面代码的意思是:我们给2号信号设置自定义动作为,当发送2号信号,会调用handler方法打印。main函数中是一个循环,不断打印。那么只需要验证,当我们键盘输入ctrl+c就会调用handler方法打印就能验证。

 可以看到,当执行kill -2命令的时候不再是终止进程,而是执行我们自己编写的自定义动作。执行热键ctrl+c的时候也是如此。

🏆二、信号的产生

铺设了前面的概念后再来聊信号的产生就很方便了。

①通过终端按键产生信号

除了ctrl+c这个热键可以终止前台进程,ctrl+\也是终止进程的热键。这些都属于通过终端按键产生信号。

 ctrl+\对应的是3)SIGQUIT信号。

 2号和3号默认就是终止进程。

②调用系统函数向进程发信号

🎃kill()

pid:要发送信号的目标进程pid。

sig:向目标进程发几号信号

 编写两个cpp文件,mysignal.cc写的是调用kill()函数,它是通过命令行参数解析来实现的,而mytest.cc则是测试文件,通过运行mysignal.cc文件的可执行程序解析命令行参数来实现对mytest可执行程序的控制。

 kill接口可以向任意进程发送任意信号。

🎃raise

 raise()接口没有参数目标进程,raise()是给自己发送信号。

这段代码的含义是5s后将自己终止。

 

这个接口是非常简单的,它可以说就是kill(getpid(),signo).

 🎃abort

 abort()接口无参无返回值。它的用处是导致进程异常终止。调用abort()接口会给自己发送指定的信号。

 

这个指定的信号是6)SIGABRT信号。

我们可以验证一下 

 abort()也可以通过kill()封装。kill(getpid(),SIGABRT).

关于信号处理行为的理解:有很多的情况,进程收到的大部分的信号,默认处理动作都是终止进程。信号的意义不是由终止进程这个动作决定的,而是信号的不同代表不同的事件,但是对事件发生之后的处理动作(终止进程)可以是一样的!

③由硬件异常产生信号

信号产生,不一定非得用户显示发送。而是有时进程执行出现一些错误,OS会向进程发送一些信号。

🎄/0操作

 

 

这里因为有/0操作,所以OS发送给进程信号 8)SIGFPE.可以简单证明一下,用signal()信号将待验证的信号的默认动作改为自定义动作。如果OS给进程发送的确实是8号信号,那么就会执行8号自定义动作!

代码:

 

 

 通过演示验证确实是当/0行为出现时OS发送给进程8号信号。

但是这里还有一些问题,我们观察演示发现只除了一次0,为什么OS一直发送信号呢?

可能有的老铁会觉得是因为在while循环中,我们不妨把/0操作放在循环之外。

 

通过演示可以看到并不是循环造成的。 这里要解释这些现象,首先要介绍一些硬件相关的知识。

除0的理解

如图是我画的一个CPU内部的简化抽象图,eax就是寄存器。右边是代码。

其中当在执行计算时,eax1放10,eax2放0,eax3中放计算结果。除了要得到计算结果还要判断这个结果有没有问题,那么CPU中还有一个状态寄存器来衡量运算结果。

因为10/0得到无穷大,这样会导致状态寄存器中溢出标志位由0设为1.说明一下:溢出标记位用来标记计算结果是否有问题。默认为0,表示这次计算没有问题。而如果溢出标记位变为1,则表示本次计算处于溢出状态,意为本次计算结果没有意义,不需要被采纳。而这些运算异常会被OS检测到。所以会有OS向进程发送信号这一现象。那么为什么发送了这么多次信号而不是一次呢?

因为这里进程虽然受到了信号,但是因为我们将其设为了自定义行为,进程没有退出。因为CPU是时间轮转片式地执行进程,那么当进程再被调用。因为CPU的寄存器只有一份,但是寄存器中的内容属于当前进程的上下文,这些内容之前进程那一块的博客都讲述过。

重点来了:当进程被进行切换的时候,就有无数次状态寄存器被保存和恢复的过程。每一次恢复的时候,OS都会识别到CPU内部的状态寄存器中的溢出标识位是1.这也就是为什么出现了无数次的自定义行为!!!!

🎄空指针解引用

 

 这里又是哪个信号呢?

 可以看到,当发生空指针解引用问题时OS会向进程发送11)SIGSEGV段错误信号

谈到指针就不得不说谈到虚拟地址和物理地址,因为指针本质就是虚拟地址

 虚拟地址转化为物理地址是通过页表的,除了页表还有一个硬件MMUMMU叫做内存管理单元它是集成在CPU中的。通过页表在CPU形成物理地址然后去访问物理内存。

当访问nullptr时,因为不允许访问,MMU越界访问导致发生异常。OS识别到相关报错,发送信号给进程

这里再次体现了虽然都是终止进程,但是根据信号的不同,可以得出引起退出的原因,反向定位问题。

④软件条件产生信号

因为软件条件产生信号,常见的有管道pipe因为读端关闭,写端一直写,OS会向写端发送SIGPIPE来终止进程,这里读端关闭就是软件条件。

🍎定时器alarm()软件条件

alarm()就类似我们手机的闹钟,不过它是给进程设置的,设定一个时钟,在seconds之后发送信号给进程。

而这个信号就是14)SIGALRM

演示闹钟:

 

 

这里代码的意思就是统计1s左右,我们的计算机能够将数据累计多少次。因为需要访问外设导致计数比较小。我们可以自定义设置行为:

 可以看出不打印的时候,数量级差距有10^4,可以看出访问外设十分消耗时间。

无限闹钟:

 

 alarm(0)表示取消闹钟。

为什么说闹钟是软件条件呢?这和OS的底层有关系。任意一个进程,都可以通过alarm系统调用在内核中设置闹钟,那么OS内可能会存在着很多闹钟,OS需要管理这些闹钟:先描述再组织!

 OS内部比如说是通过优先级队列来管理这些闹钟,堆顶是最近一次的闹钟,OS会周期性地检测这些闹钟。这里当curr_timestamp>alarm.when时就是超时了。(curr_timestamp表示当前时间,alarm.when闹钟设定的时间)。alarm.palarm这个结构体中存储的进程的地址。

OS定期检查超时条件,当时间到了就会发送信号,它的这种行为全部由软件构成的,而条件体现在超时,所以是软件条件。

🏆三、进程退出时的核心转储的问题

 

段错误是11号信号,它的终止方式是Core,那么我们查看signal表时不免疑惑:能够终止 进程的信号有的action是Term,有的是Core,那么他们有什么区别呢

Term是直接退出了,而Core就涉及到了核心转储的问题,这种方式除了要终止进程,还要做其他的工作。但是我们这几次运行好像并没有看到其他的工作。这是因为在云服务器上,默认如果进程是Core退出的,看不到明显的现象,如果想看到需要打开一个选项--- ulimit -a

稍微看一下,管道的大小是512bytes,有8个,最多打开的文件个数是100001个等等。

其中有一个重要选项:core file size 默认是0.

而正是因为core file size 默认设置为0,所以云服务器默认关掉了核心转储。

 

 

比如我们设置core file size 为1024.

 

相比之前多了一个文件。

核心转储的意思是:当进程出现异常的时候,我们将进程在对应的时候,将内存中的有效数据转转储到磁盘中----核心转储!!

形成的文件通常以core命名,引起异常的进程pid作为后缀

 OS为了方便我们查看哪里出错,会将我们出现异常的进程上下文数据全部dump到磁盘中来支持调试。核心转储只有在发送action为Core类型的信号才会发生。

那么怎么用这个文件呢?使用gdb调试使用。

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/576015.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Python 下载的 11 种姿势,一种比一种高级

今天我们一起学习如何使用不同的Python模块从web下载文件。此外,你将下载常规文件、web页面、Amazon S3和其他资源。 通过本文的学习,你将学到如何克服可能遇到的各种挑战,例如下载重定向的文件、下载大型文件、完成一个多线程下载以及其他策…

面试官:你会从哪些维度进行MySQL性能优化?

面试官如果问你:你会从哪些维度进行MySQL性能优化?你会怎么回答? 所谓的性能优化,一般针对的是MySQL查询的优化。既然是优化查询,我们自然要先知道查询操作要经过哪些环节,然后思考可以在哪些环节进行优化…

English Learning - L3 作业打卡 Lesson3 Day21 2023.5.25 周四

English Learning - L3 作业打卡 Lesson3 Day21 2023.5.25 周四 引言🍉句1: Here is another expression about meat one man’s meat is another man’s poison.成分划分连读爆破语调 🍉句2: In other words, one person might like something very muc…

postMessage引发XSS

这次的主题是postMessage未验证消息来源origin,导致恶意代码注入的dom-xss,由于很少人关注这类型的注入,因为挖掘难度中等,需要一定的javascript代码审计能力,且漏洞危害等级不高,导致国内许多SRC都存在跨域…

【计算机网络】 7、websocket 概念、sdk、实现

文章目录 一、背景二、简介三、client3.1 ws 构造函数3.2 ws.readyState3.3 ws.onopen3.4 ws.onclose3.5 ws.onmessage3.6 ws.send3.7 ws.bufferedAmount3.8 ws.onerror 四、server4.1 go4.1.1 apifox client4.1.2 js client 五、范式 一、背景 已经有了 http 协议&#xff0c…

懂点自动化基础就要25k? 测试总监:给你15K,爱来不来

公司前段缺人,也面了不少测试,结果竟然没有一个合适的。一开始瞄准的就是中级的水准,也没指望来大牛,提供的薪资在10-25k,面试的人很多,但平均水平很让人失望。看简历很多都是3年工作经验,但面试…

【C++11】C++的新特性(详解)

文章目录 1.C11简介2.统一的列表初始化2.1{}初始化2.2 std::initializer_list 3.声明3.1 auto3.2 decltype3.3 nullptr 4.范围for5.STL中一些变化5.1 array5.2 forward_list容器5.3 unordered_map和unordered_set容器 1.C11简介 相比于C98/03,C11则带来了数量可观的…

2023年武汉市职业院校技能大赛“网络安全”竞赛任务书

2023年武汉市职业院校技能大赛“网络安全” 竞赛任务书 一、竞赛时间 总计:360分钟 竞赛阶段 竞赛阶段 任务阶段 竞赛任务 竞赛时间 分值 A模块 A-1 登录安全加固 180分钟 200分 A-2 本地安全策略配置 A-3 流量完整性保护 A-4 事件监控 A-5 服…

2023年电工杯B题半成品论文使用讲解

注:蓝色字体为说明备注解释字体,不能出现在大家的论文里。黑色字体为论文部分,大家可以根据红色字体的注记进行摘抄。该文件为半成品论文,即引导大家每一步做什么,怎么做,展示按着本团队的解题思路进行建模…

Integrated LogicAnalyzer v6.2 (Vivado ILA使用方法)

Chapter 1 Overview 1.1 Feature Summary(功能摘要) FPGA设计中的信号连接到ILA核时钟和探针输入(图1-1)。这些连接到探针输入的信号以设计速度进行采样,并使用片上块RAM(BRAM)进行存储…

【旅游网】前后端分离——用户管理

1、先创建数据库,建立用户表 2、创建后端项目,这里使用Springboot,创建好controler、mapping、pojo、service四个文件,在实体里创建User类 package com.example.pjtest.Pojo;public class User {public int id_u;public Strin…

SpringBoot 之 Tomcat 与 Undertow 容器性能对比

一、前言🔥 环境说明:Windows10 Idea2021.3.2 Jdk1.8 SpringBoot 2.3.1.RELEASE 在上一篇《SpringBoot 之配置 Undertow 容器》一文中写道:“Undertow 的性能和内存使用方面都要优于 Tomcat 容器”, 这一期,我就要给大家来求证…

受不了了,被00后卷的想辞职了

在程序员职场上,什么样的人最让人反感呢? 是技术不好的人吗?并不是。技术不好的同事,我们可以帮他。 是技术太强的人吗?也不是。技术很强的同事,可遇不可求,向他学习还来不及呢。 真正让人反感的,是技术平平&…

御剑WEB指纹识别系统教程,图文教程(超详细)

「作者简介」:CSDN top100、阿里云博客专家、华为云享专家、网络安全领域优质创作者 「推荐专栏」:对网络安全感兴趣的小伙伴可以关注专栏《网络安全入门到精通》 御剑WEB指纹识别 一、基本使用二、内置字典三、自定义字典四、扫描原理 御剑WEB指纹识别系…

php html转pdf wkhtmltopdf

系统CentOS7.6 1.安装 wkhtmltopdf yum install wkhtmltopdf 看别的大佬的教程这步就已经可以正常生成,但我这边运行脚本的时候返回了 "wkhtmltopdf: cannot connect to X server" 2.安装 Xvfb yum install Xvfb 3.运行脚本 xvfb-run --server-ar…

20220912深圳市梧桐山桃花源看植物

20220912深圳市梧桐山桃花源看植物 2023/5/27 13:27 大自然生态探索之旅第3期 明天去梧桐山看植物。有空不? 交通方式: 黄贝岭地铁站C出口坐M445到终点! 02木荷 https://baijiahao.baidu.com/s?id1676100940201729045&wfrspider&fo…

人生苦短,我用Python。

人生苦短,我用Python。欢迎大家一起分享,你是如何入门Python的~ 方向一:你是如何学习/自学 Python 的? 偶然的机会接触到python,于是开始利用空闲时间学起了python。自学过2年python,有一些学习心得和避坑…

分布式事务的21种武器 - 6

在分布式系统中,事务的处理分布在不同组件、服务中,因此分布式事务的ACID保障面临着一些特殊难点。本系列文章介绍了21种分布式事务设计模式,并分析其实现原理和优缺点,在面对具体分布式事务问题时,可以选择合适的模式…

Linux——进程轮换

目录 一.进程切换 1.定义: 2.硬件上下文: 总结: 一.进程切换 1.定义: 进程切换(process switch),作为抢占式多任务的一个重要功能,其实质就是OS内核挂起正在运行的进程A,然后将先前被挂起的另一个进程B恢复运行。 2.硬…

天书奇谈3D服务端搭建架设教程Centos

天书奇谈3D服务端搭建架设教程Centos 大家好,我是艾西,今天给大家分享一款回合制MMORPG手游的搭建教程。也算是G 内回合制手游的第一梯队吧,回合制手游总会有那么一帮热爱的玩家我们话不多说直接进入正题开始操作: 架设准备&…