【Linux】初识信号及信号的产生

初始信号

  • 初始信号
    • 什么是信号
    • 站在应用角度的信号
    • 查看Linux系统定义的信号列表
  • 信号的常见处理方式
  • 信号的产生
    • 通过终端按键产生信号
      • 什么是core dump?
      • 如何开启core dump?
      • core dump有什么用?
      • 为什么默认关闭core dump?
      • 设置了core文件大小但是没有产生core文件的可能原因
    • 通过系统函数向进程发信号
    • 由软件条件产生信号
    • 硬件异常产生信号
      • 一点简单的拓展,有关于键盘产生信号
      • 关于异常产生信号

初始信号

什么是信号

Linux系统提供的让用户(进程)给其他进程发送异步信息的一种方式

  1. 在没有发生的时候,我们已经知道发生的时候,怎么处理了
  2. 我们可以识别各种类型的信号,结合第一条和第二条,我们能识别一个信号并处理(打个比方说,当我们过马路时看到红灯时,我们眼睛看到了红灯信号,然后我们的处理方式通常就是站在马路边上等待)
  3. 信号到来的时候,我们正在处理更重要的事情,我们暂时不能处理到来的信号,我们必须要将到来的信号进行临时保存
  4. 信号到了,可以不立即处理,自己在合适的时候处理
  5. 信号的产生是随时产生的,我们无法准确预料,所以信号是异步发送的(信号的产生,是由别人(用户、进程)产生的,我收到之前,我一直在忙我的事情,并发在运行的)
    将以上的“我”换成进程,就是进程看待信号的方式

站在应用角度的信号

在这里插入图片描述

  • 用户输入指令,在shell下启动一个前台进程
  • 用户按下ctrl+c,键盘输入产生硬件中断,被OS获取,解释成信号,发送给目标前台进程
  • 前台进程因为收到信号,进而引起进程退出
    在这里插入图片描述
    注意:
    1、 ctrl+c 产生的信号只能发送给前台进程,一个命令后面加上&可以将其放到后台执行,这样shell就不必等待该进程结束就可以接受新的命令,启动新的进程
    2.、shell可以同时接受运行一个前台进程任意多个后台进程,只有前台进程才能接到例如ctrl+c这种控制链产生的信号
    3、 前台进程在运行过程中用户随时可能按下ctrl+c而产生一个信号,也就是说该进程的用户代码空间执行到任何地方都可能因为收到信号而终止或者产生其他行为,所以信号相对于进程的控制流程来说是异步的

查看Linux系统定义的信号列表

在这里插入图片描述

  • 每个信号都有一个编号和一个宏定义名称,比如2号信号就是#define SIGINT 2
  • 编号34以上的是实时信号,这篇博客主要是讨论编号34以下的信号,不讨论实时信号,这些信号各自在什么条件下产生,默认的处理动作是什么,在signal(7)中都有详细的说明:在命令行输入man 7 signal即可查看
    在这里插入图片描述

信号的常见处理方式

常见的信号处理方式有以下三种

  • 忽略此信号
  • 执行该信号的默认处理动作
  • 提供一个信号处理的函数,要求在内核处理信号的时候切换到用户态执行这个处理函数,这种方式称之为捕捉(catch)一个信号

  这里要先介绍一个linux的系统调用signal
在这里插入图片描述
在这里插入图片描述
1、当我们要忽略一个信号时(这里用2号信号为例),就将第二个参数传递SIG_IGN即可
在这里插入图片描述
在这里插入图片描述
2、执行该信号的默认处理动作,2号信号的默认处理动作就是终止当前正在运行的前台进程,这里就不再演示了
3、让该信号执行自定义的动作
在这里插入图片描述
在这里插入图片描述

信号的产生

通过终端按键产生信号

  SIGINT的默认处理动作是终止当前进程,SIGQUIT的默认处理动作是终止进程并Core Dump(之前演示时用到的ctrl+c就是向进程发送2号的方式)
在这里插入图片描述
  进程收到了的大部分信号的动作都是进程自己终止,终止有两种方案,一种叫做core,一种叫做term,它们又什么区别?

什么是core dump?

  首先解释什么是Core Dump。当一个进程要异常终止时,可以选择把进程的用户空间内存数据全部 保存到磁盘上,文件名通常是core,这叫做Core Dump。进程异常终止通常是因为有Bug,比如非法内存访问导致段错误,事后可以用调试器检查core文件以查清错误原因,这叫做Post-mortem Debug(事后调试)。
  一个进程允许产生多大的core文件取决于进程的Resource Limit(这个信息保存 在PCB中)。默认是不允许产生core文件的,因为core文件中可能包含用户密码等敏感信息,不安全。在开发调试阶段可以用ulimit命令改变这个限制,允许产生core文件。 首先用ulimit命令改变Shell进程的Resource Limit,允许core文件最大为1024K
  而term就是不产生任何文件的普通终止行为

如何开启core dump?

  之前已经提到了core dump默认是关闭的,使用命令ulimit -c可以查看相关的信息
在这里插入图片描述
使用ulimit -c可以通过设置文件大小打开core dump功能
在这里插入图片描述

core dump有什么用?

  当一个进程发生了除0异常,如果是term结束,在系统层面上直接不管了,直接把代码和数据还有内核数据结果直接释放掉,这个进程就没了
  但是如果信号除0动作是core,则会将进程在内存中的核心数据(主要是与调试有关)转储到磁盘中形成core、core.pid的文件,这样可以定位到这个进程为什么会退出,以及是执行到哪一行代码退出了
  core其实是一种机制,如果进程在执行过程中出异常了,就将进程在内核中的核心数据转储到磁盘当中以文件的方式保存,这种方式叫做core dump:核心转储
  所以命令ulimit -c其实是在设置core文件的上限大小(默认情况下为0,代表即便是core退出,也不要形成核心转储文件)
  说了这么多,core文件中既然包含了相关的错误信息,我们就可以根据文件中的错误信息进行调试

int main()
{int a=10;a/=0;return 0;
}

  比如这段代码,在代码中产生一个除0异常,然后运行程序
在这里插入图片描述
发现多了一个文件core,这个文件存的就是程序的错误原因
在这里插入图片描述
  大部分信号当中,只要是退出信息(Action)是core,都是可以通过打开core dump功能,事后根据core文件进行定位问题和调试
云服务器默认是将进程以core形式退出,进行了特定的设定,默认core是被关闭的

为什么默认关闭core dump?

  Linux系统是有服务关闭自动重启的功能的,如果服务一异常关闭,然后重启,一关闭又重启…就会留下很多的core文件,时间一长就会导致云服务器的磁盘被占满->防止未知的core dump一直在进行,导致磁盘服务器被打满

设置了core文件大小但是没有产生core文件的可能原因

  我在第一次使用已经设置了core文件的大小但是出现异常时并没有出现core文件,我查了一下,有以下几种说法

  • 程序设置了用户id(即调用setuid),但当前用户并非该程序文件的所有者
  • 程序设置了组id(即调用setgid),但当前用户并非该程序文件的组所有者
  • 用户没有当前目录或指定core文件产生目录的写权限
  • core文件太大,磁盘空间不足
      但是我检查了这几点发现这些都不是原因,后来我了解到,可能是core文件产生的位置有关,core的缺省位置是程序所在目录,可以通过修改/proc/sys/kernel/core_pattern来指定core文件生成位置了名称。
      然后我查看了core_pattern文件,发现文件内容是一段脚本程序,后来查看说明文件,才知道core_pattern中如果首先指定了一个 ‘|’ 管道符,则会将生成的core文件传递给后面所跟的脚本去处理。
    在这里插入图片描述
      至此,也就确定了问题的原因,| 管道符后面的脚本将我们的core文件给吞了,解决方法自然就是去掉这个脚本,换成自己指定的目录
      但直接去修改core_pattern文件并没有成功,保存时会提示FSync错误,查阅资料得知,这个文件有特殊限制,只能通过命令:
sudo bash -c "echo 这里是写入内容 > /proc/sys/kernel/core_pattern "

我使用的是

sudo bash -c "echo core > /proc/sys/kernel/core_pattern "

  来进行写入,即指定程序所在目录为core文件生成目录,core文件名称为"core"。

通过系统函数向进程发信号

在这里插入图片描述
在这里插入图片描述  kill函数是向任意进程发送信号,而raise是向自己发送信号。两个函数的返回都是成功返回0,错误返回-1
在这里插入图片描述
  abort函数的作用是使当前进程接收到信号而异常重者,和kill(getpid(),6)用法有点相似(6号信号是SIGABRT)

由软件条件产生信号

  SIGPIPE就是很典型的由软件条件产生的信号,这个信号是在进程间通信方式之一——管道中,读端已经关闭而写端仍然还在写入时,这个时候系统就会通过向写端发送SIGPIPE信号关闭写端
  还有个信号SIGALRM信号

#include <unistd.h>
unsigned int alarm(unsigned int seconds);

  调用alarm函数可以设定一个闹钟,也就是告诉内核在seconds秒之后给当前进程发SIGALRM信号, 该信号的默认处理动作是终止当前进程。
  这个函数的返回值是0或者是以前设定的闹钟时间还余下的秒数。打个比方,某人要小睡一觉,设定闹钟为30分钟之后响,20分钟后被人吵醒了,还想多睡一会儿,于是重新设定闹钟为15分钟之后响,“以前设定的闹钟时间还余下的时间”就是10分钟。如果seconds值为0,表示取消以前设定的闹钟,函数的返回值仍然是以前设定的闹钟时间还余下的秒数
  但是"闹钟"只能响一次,所以如果要让这个闹钟多次响,需要捕捉SIGARM信号,在处理完信号后,再设置一个闹钟

#include<iostream>
#include<signal.h>int main()
{int cnt=0;alarm(1);while(true){std::cout<<cnt<<std::endl;cnt++;}return 0;
}

  这个代码的作用就是在1秒钟之内不停的数数,1秒种到了因接收到了SIGARM就停止

硬件异常产生信号

  硬件异常被硬件以某种方式被硬件检测到并通知内核,然后内核向当前进程发送适当的信号。例如当前进程执行了除以0的指令,CPU的运算单元会产生异常,内核将这个异常解释 为SIGFPE信号发送给进程。再比如当前进程访问了非法内存地址,MMU会产生异常,内核将这个异常解释为SIGSEGV信号发送给进程。

一点简单的拓展,有关于键盘产生信号

  键盘是一个硬件,作为一个键盘它需要知道以下几点

  1. 按键按下了

  2. 哪些按键按下了

  3. 字符输入(字符设备(键盘都是字符输入)),键盘还可以进行组合键输入(ctrl +c),相当于输入的是命令
      不管你是键盘输入还是组合键输入,在键盘层面上,就是按键,但是到底输入的字符还是命令,这个是由操作系统决定的(键盘和OS联合解释),因为一切皆文件,所以键盘设备也可以看作是操作系统打开的一个文件,所以键盘获取到的数据就会放到键盘的输入缓冲区里,上层就通过0号文件描述符将其读出来
      操作系统怎么知道键盘上面有数据输入?
      要么是操作系统去定期的检测键盘是否有数据被按下,但是这样的话效率就太低了
      其实操作系统时使用了一种硬件中断的技术,当操作系统刚开机的时候,已经形成了一张表,这张表上已经注册了很多对软硬件进行操作的方法
      这个所谓的中断向量表就是函数指针数组。此时的CPU正在执行进程代码。这个中断向量表其实也是属于操作系统的数据
      CPU只和内存打交道,并且CPU内部有很多的针脚(物理性的),这些针脚在主板上是可以和键盘进行连接的(每个针脚都有特定的编号),未来键盘在进行按键的时候会给CPU中特定的针脚触发硬件中断,CPU就知道哪个针脚上面有高电平了就可以识别这个针脚。
      总之,CPU已经知道了有触发的针脚上面已经有高电平了,有因为每个针脚上面又有特定的编号,也就意味着当键盘被按下时会向CPU的2号针脚处发送高电平(也可以把这个2号称之为中断号)。即CPU能识别到

  4. 有高电平

  5. 是几号针脚

  CPU内部还有寄存器,寄存器req就会将中断号存起来(到此,硬件到软件的动作就做完了)
  然后,CPU识别到对应的寄存器中有数字,CPU就直接要求操作系统先暂停当前进程,然后让操作系统拿着中断号去中断向量表去查对应的方法,然后根据中断向量表中对应的方法去执行读取数据的任务。因为中断向量表中的方法都是操作向量表提供的,所以在调用里面的方法的时候,操作系统就能够知道数据到来了并将数据读入内存中
  读到数据之后就要对数据做“判定”,看是字符还是控制命令,如果是字符,就将其放入到缓冲区中让上层读取;如果是控制命令,就将其解释成信号,让后再将这个信号发送给进程(解释信号就是到进程的pcb中将位图上对应的比特位由0置1)
  之前提到,当信号在到来的时候,如果进程正在处理更重要的事情,就会暂时不处理信号,而是将信号进行临时保存,保存在哪里呢?保存在进程的pcb中。一个进程可能会收到多个信号,所以pcb内部就需要对收到的信号进行管理,因为信号的编号是1、2……31,所以pcb中采用的就是位图的方法保存信号

关于异常产生信号

emsp; CPU中有很多寄存器,有些寄存器是用来做计算的,也有些寄存器是用来CPU内部中的管理,其中就有一个寄存器叫做EFLAGS/RFLAGS,这个是标志寄存器,包含了状态和控制标志,其中有一个标志称为CF(这个标志称作为是溢出标志,Overfliow Flag),当CPU内部进行运算

int a=10;
a/=0;

  CPU内部会将10放到一个寄存器中(假设为eax),然后将0放到一个寄存器中(假设为ebx),按照代码就是让eax中数初一abx中的数,然后将结果写回到eax中,但是在运算10除以0的时候,得到的是一个巨大的数字,据发生了溢出,然后溢出标志位设为1,也就是说计算出现了错误(计算错误,表现到了CPU的寄存器上也就是硬件上),此时操作系统识别到了操作系统内部有错误,CPU就不再调度进程了,CPU就告诉操作系统,操作系统发现确实出现了异常,就直接向对应进程的pcb中发送对应的溢出信号(修改对应的位图),至此,就完成了信号的发送

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

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

相关文章

【SQL学习进阶】从入门到高级应用(八)

文章目录 ✨连接查询✨什么是连接查询✨连接查询的分类✨笛卡尔积现象✨内连接✨什么叫内连接✨内连接之等值连接✨内连接之非等值连接✨内连接之自连接 ✨外连接✨什么叫外连接✨外连接之左外连接&#xff08;左连接&#xff09;✨外连接之右外连接&#xff08;右连接&#xf…

ubuntu 18.04 ros1学习

总结了一下&#xff0c;学习内容主要有&#xff1a; 1.ubuntu的基础命令 pwd: 获得当前路径 cd: 进入或者退出一个目录 ls:列举该文件夹下的所有文件名称 mv 移动一个文件到另一个目录中 cp 拷贝一个文件到另一个目录中 rm -r 删除文件 gedit sudo 给予管理员权限 sudo apt-…

php反序列化学习(2)

1、魔术方法触发规则&#xff1a; 魔术方法触发的前提是&#xff1a;魔法方法所在类&#xff08;或对象&#xff09;被调用 分析代码&#xff0c;_wakeup()的触发条件是进行反序列化&#xff0c;_tostrinng()触发的条件是把对象当成字符串调用&#xff0c;但是魔术方法触发的前…

安全测试用例及解析(Word原件,直接套用检测)

5 信息安全性测试用例 5.1 安全功能测试 5.1.1 标识和鉴别 5.1.2 访问控制 5.1.3 安全审计 5.1.4 数据完整性 5.1.5 数据保密性 5.1.6 软件容错 5.1.7 会话管理 5.1.8 安全漏洞 5.1.9 外部接口 5.1.10 抗抵赖 5.1.11 资源控制 5.2 应用安全漏洞扫描 5.2.1 应用安全漏洞扫描 5.3…

方差和标准差的区别

标准差和方差都是用来衡量随机变量的离散程度的统计量&#xff0c;它们之间有以下区别&#xff1a; 方差&#xff08;Variance&#xff09;&#xff1a; 方差是衡量随机变量离其均值的离散程度的度量。它是各个数据与其平均值之差的平方和的平均值。方差的公式为&#xff1a;…

鹤城杯 2021 流量分析

看分组也知道考http流量 是布尔盲注 过滤器筛选http流量 将流量包过滤分离 http tshark -r timu.pcapng -Y "http" -T json > 1.json这个时候取 http.request.uri 进一步分离 http.request.uri字段是我们需要的数据 tshark -r timu.pcapng -Y "http&quo…

【全开源】Java情侣飞行棋系统微信小程序+H5+APP源码+微信公众号

​让爱情与游戏并行 一、引言&#xff1a;飞行棋与情侣时光的交融 在快节奏的现代生活中&#xff0c;情侣们常常寻找一种既能增进感情又能共同娱乐的方式。飞行棋&#xff0c;这款经典的家庭游戏&#xff0c;因其简单易上手、策略性强而深受大众喜爱。而现在&#xff0c;我们…

使用compile_commands.json配置includePath环境,解决vscode中引入头文件处有波浪线的问题

通过编译时生成的 compile_commands.json 文件自动完成对 vscode 中头文件路径的配置&#xff0c;实现 vscode 中的代码的自动跳转。完成头文件路径配置后&#xff0c;可以避免代码头部导入头文件部分出现波浪线&#xff0c;警告说无法正确找到头文件。 步骤 需要在 vscode 中…

木馒头头戴式蓝牙耳机

这里写目录标题 木馒头二代头戴式蓝牙耳机清除连接记忆 木馒头二代头戴式蓝牙耳机清除连接记忆 在配对模式下&#xff0c;同时按住播放和暂停按钮4秒&#xff0c;LED闪烁紫色3次&#xff0c;即为清除成功。

电子烟开发【恒压、恒有效算法】

恒压算法 pwm是通过软件模拟的 pwm满值运行是250全占空比 #define D_TARGET_AVERAGE_VOLTAGE 3500 //R_ADC1_Vout &#xff1a;发热丝两端AD值 //R_ADC_FVR &#xff1a;电池电压AD值 //FVR_VOLTAGE &#xff1a;电池AD参考电压 满电值AD //R_Smk1Duty &#xff1a;最后…

深入分析 Android Service (一)

文章目录 深入分析 Android Service (一)1. Android Service 设计说明1.1. Service 的类型1.2. Service 的生命周期1.3. 创建和启动 Service1.4. 绑定 Service1.5. ServiceConnection1.6. 前台 Service1.7. IntentService示例&#xff1a;创建和使用 IntentService 2. Service …

CentOS7部署Yearning并配置MySQL数据库远程访问详细流程——“cpolar内网穿透”

文章目录 前言1. Linux 部署Yearning2. 本地访问Yearning3. Linux 安装cpolar4. 配置Yearning公网访问地址5. 公网远程访问Yearning管理界面6. 固定Yearning公网地址 前言 本文主要介绍在 Linux 系统简单部署 Yearning 并结合 cpolar 内网穿透工具实现远程访问&#xff0c;破除…

Git基本使用教程(学习记录)

参考文章链接&#xff1a; Git教程&#xff08;超详细&#xff0c;一文秒懂&#xff09; RUNOOB Git教程 Git学习记录 1Git概述 1.1版本控制软件功能 版本管理&#xff1a;更新或回退到历史上任何版本&#xff0c;数据备份共享代码&#xff1a;团队间共享代码&#xff0c;…

【vscode篇】1-VScode设置语言为中文,2-解决中文注释乱码问题。

设置语言为中文 在前端开发中&#xff0c;Visual Studio Code(简称vscode)是一个非常好用的工具&#xff0c;但第一次打开vscode会发现界面为英文&#xff0c;这对很多开发者来说会很不友好&#xff08;比如我&#xff09;&#xff0c;把界面设置成中文只需要安装一个插件即可&…

ONLYOFFICE 协作空间与 WordPress 如何集成

转载自作者&#xff1a;VincentYoung&#xff0c;略有改动 阅读本文&#xff0c;了解如何将 ONLYOFFICE 协作空间与 WordPress 进行集成。 ONLYOFFICE 协作空间是其去年新推出的产品&#xff0c;用创建虚拟办公室房间的方式&#xff0c;来组织公司内部团队成员的在线协作办公&…

Charles-ios无法抓包原因之一证书

VPN证书安装完成后依然无法抓包存在无网络问题 VPN安装证书后直接抓包这时候抓包接口返回无网络&#xff0c;原因是IOS通用-关于本机-证书信任设计未开启信任

webpack5零基础入门-19HMR的应用

1.定义 HMR即HotModuleReplacement 开发时&#xff0c;当我们修改了其中一个模块的代码webpack默认会将所有模块重新打包编译&#xff0c;速度很慢所以我们需要做到修改摸个模块代码&#xff0c;只对这个模块的代码重新打包编译&#xff0c;其他模块不变&#xff0c;这样打包…

初识Spring Boot:构建项目结构与组件解析

目录 前言 第一点&#xff1a;项目的结构 第二点&#xff1a;controller类的创建与使用&#xff08;构造器&#xff09; 第二点&#xff1a;service类的创建与使用&#xff08;逻辑层&#xff09; 第三点&#xff1a;Mapper类的创建与使用(数据操作) 总结 前言 在进行Sp…

【稳定检索】2024年心理学与现代化教育、媒体国际会议(PMEM 2024)

2024年心理学与现代化教育、媒体国际会议 2024 International Conference on Psychology and Modern Education and Media 【1】会议简介 2024年心理学与现代化教育、媒体国际会议即将召开&#xff0c;这是一场汇聚全球心理学、教育及媒体领域精英的学术盛宴。 本次会议将深入探…

目前最强的AI绘画工具 DALL-E、Stable Diffusion 和 Midjourney工具对比

大家好&#xff0c;我是AIGC的实践者SKY&#xff0c;今天和大家来聊聊DALL-E、Stable Diffusion和Midjourney。 随着人工智能技术的飞速发展&#xff0c;艺术生成工具如DALL-E、Stable Diffusion和Midjourney等&#xff0c;已经成为创意产业的新宠。这些工具利用深度学习算法&…