Linux信号机制探析--信号的产生

news2024/11/26 16:52:10
🍑个人主页:Jupiter.
🚀 所属专栏:Linux从入门到进阶
欢迎大家点赞收藏评论😊

在这里插入图片描述

在这里插入图片描述

目录

  • `📚信号`
            • `什么是信号?`
            • `为什么要有信号?`
            • 查看Linux系统中信号
    • `🎈信号产生`
      • `📕kill 命令产生信号`
      • `🏠键盘产生 `
      • `🦅系统调用`
            • kill系统调用
            • raise系统调用
            • abort系统调用
      • `🍑软件条件`
      • `🌠硬件异常产生信号`
        • 对于键盘产生信号的理解
        • 对硬件异常产生信号的理解
            • 为什么默认的是core dump(核心转储)功能是关闭的呢


📚信号

什么是信号?
  • 信号是Linux系统提供的让进程或则操作系统给其他进程发送异步信息的一种方式。

  • 信号的产生是随时产生的,进程无法预料,所以信号是异步发送的。(信号的产生是由别的进程产生的,在收到信号之前,我(进程)在做自己的事情,我和发送信号的进程是在并发跑的。所以是异步)

为什么要有信号?
  • Linux系统中要有信号,主要是为了提供一种机制,以便异步地处理系统事件和进程间通信。

    • 进程间通信:信号是进程间通信(IPC)的一种方式,允许进程之间异步地传递消息。
    • 系统事件通知:操作系统可以使用信号来通知进程发生了系统级事件,如非法内存访问(段错误)、软件终止请求(如用户按下Ctrl+C)等。
    • 简化编程模型:信号提供了一种机制,允许操作系统和应用程序开发者以一种标准化的方式处理各种异步事件,从而简化了编程模型。
    • 资源管理:信号可以用于管理进程占用的资源。例如,当进程占用的资源超出限制时,系统可以发送信号来终止或暂停该进程。
    • 用户交互:用户可以通过发送信号来控制进程的行为,例如,使用kill命令发送信号以终止或暂停进程。
    • 错误处理:当进程执行非法操作时,系统可以发送信号来通知进程发生了错误,进程可以根据信号的指示进行错误处理。
查看Linux系统中信号
  • kill -l命令可以查看系统定义的信号列表:
  • 每个信号都有一个编号和一个宏定义名称,这些宏定义可以在signal.h中找到,例如其中有定义 #define SIGINT 2
  • 编号34以上的是实时信号,本章只讨论编号34以下的信号,不讨论实时信号。这些信号各自在什么条件下产生,默认的处理动作是什么,在signal(7)中都有详细说明: man 7 signal
  • 注意:没有0 ,32 ,33号信号

🎈信号产生

📕kill 命令产生信号

  • 如:杀掉指定进程: kill -9 进程编号

🏠键盘产生

  • 如:2号信号 :ctrl + c 可以终止进程 3号信号:ctrl + \ 终止进程
  • 会将该组合键解释为信号 --> 向目标进程发送该信号 —> 进程收到信号 —> 响应信号。

🦅系统调用

kill系统调用

函数介绍:

  • 功能: 向任意的进程发送任意的信号。

  • 参数:参数一:进程pid ; 参数二:信号编号或则信号名称。

  • 返回值: 0表示成功,-1表示失败。

示例代码:

void handler(int signo)
{
     cout << "receive a signal: " << signo << endl;
}
int main()
{
    signal(2,handler);
    int n = kill(getpid(),2);  //给自己发送2号信号

    return 0;
}

运行结果预期:使用kill系统调用给自己发送一个2号信号,2号信号被捕捉,当收到二号信号的时候,执行我们写的handler函数,打印信息 :receive a signal:2

运行结果:
在这里插入图片描述

raise系统调用

函数介绍:

  • 功能:谁调用,就向哪一个进程发送任意信号

  • 参数:信号编号/信号名称

  • 返回值:0表示成功,非0表示失败。

代码示例:

void handler(int signo)
{
     cout << "receive a signal: " << signo << endl;
}

int main()
{
    signal(2,handler);
    int n  = raise(2);

    return 0;
}

运行结果:
在这里插入图片描述

abort系统调用

函数介绍:

  • 功能:向调用该函数的进程发送6号信号:SIGABRT(终止进程)。

示例代码:

int main()
{
    int cnt = 1;
    while(cnt++)
    {
        if(cnt == 5)
        {
            abort();
        }
        cout<<"i am a process,pid:"<<getpid()<<endl;
    }
    return 0;
}

运行结果:
在这里插入图片描述

🍑软件条件

SIGPIPE是一种由软件条件产生的信号(管道的读端不读,还关闭了读文件描述符,则写端就会因为写条件不具备而被OS终止,OS给写端进程发送的信号就是SIGPIPE:13号信号)。本节还介绍alarm函数SIGALRM信号

函数介绍:

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

这个函数的返回值是0或者是以前设定的闹钟时间还余下的秒数。比如:当我们设定一个50秒的闹钟,如果在20秒的时候,提前给该进程发送一个SIGALRM信号使进程提前响应,这时,返回值就为50-20=30。

alarm(0):取消闹钟

示例代码:

int main()
{
    alarm(5);
    while(true)
    {
         cout<<"i am a process,pid:"<<getpid()<<endl;
         sleep(1);
    }
    return 0;
}

运行结果:
在这里插入图片描述

对SIGALRM信号进行捕捉,实现2秒循环的闹钟
代码实现:

void handler(int signo){
    cout << "receive a signal: " << signo << endl;
    alarm(2);
}
int main()
{
    signal(SIGALRM,handler);
    alarm(2);
    while(true)
    {
         cout<<"i am a process,pid:"<<getpid()<<endl;
         sleep(1);
    }
    return 0;
}

运行结果:
在这里插入图片描述

🌠硬件异常产生信号

硬件异常被硬件以某种方式被硬件检测到并通知内核,然后内核向当前进程发送适当的信号。

  • 例如当前进程执行了除以0的指令,CPU的运算单元会产生异常,内核将这个异常解释 为SIGFPE信号发送给进程。
  • 再比如当前进程访问了非法内存地址,MMU会产生异常,内核将这个异常解释为SIGSEGV信号发送给进程。

除0异常示例代码:

int main()
{
    int a = 0;
    int b = 4/0;
    while(true)
    {}
    sleep(1);

    return 0;
}

运行结果:
在这里插入图片描述

访问空指针示例代码:

int main()
{

    int *p = 0;
    *p=10;

    return 0;
}

运行结果:
在这里插入图片描述

对于键盘产生信号的理解

字符输入(字符设备),组合键输入(输入的命令),对于键盘来说,输入的一律当成字符处理,至于到底是字符还是命令,是需要OS键盘驱动来联合解释的。

OS怎么知道键盘在输入数据?(简略介绍)

  • 使用了一种硬件中断的技术。
  • 在开机的时候,OS已经形成了一张中断向量表(函数指针数组),这张表可以提前注册很多对软硬件操作的方法,比如下面表中2号位置是从键盘中读取数据,CPU底部由很多的针脚与外设相连接,这些针脚都有自己的编号当OS正在执行常规代码得时候,用户按键盘输入数据得时候,会给CPU上的特定针脚触发特定的硬件中端,CPU就会将该针脚编号放到一个寄存器中,这时候硬件到软件的动作就完成了,然后CPU就会要求OS停止当前正在执行的工作,让OS根据中端号,取中端向量表中查找对应的操作方法,然后去执行读取键盘数据的任务。
    在这里插入图片描述

通过上面的操作后,已经读取到了数据了,接下来会对读取的数据进行判定

如果操作系统判定为是一般字符输入,则直接放到键盘缓冲区中,如果判定为控制命令OS则会将控制命令解释成信号,然后将信号发送给进程

对硬件异常产生信号的理解
  • 除0错误问题

    首先,计算均在CPU中进行的,对于除0错误的计算过程中,会将标志寄存器中的溢出位的0置为1,将计算错误表现到CPU的寄存器上(硬件上),然后CPU发现硬件出现异常,这时OS会介入,发现问题后,将对应的信号发送给相应的进程。

  • 野指针问题

    CPU有一个硬件MMU,专门负责虚拟地址到物理地址的转换,同时又两个寄存器,CR2与CR3,如果虚拟地址转换成功,会将转换好的物理地址放到CR3中,如果转换出错,则会将错误标志信息放到CR2中,当野指针的时候,首先将野指针地址放到一个寄存器中,然后通过MMU进行转换,在转换的过程中,发现页表中没有这个虚拟地址或则该虚拟地址中没有相应的权限,则会转换出错,将错误标记放在CR2中,表明了CR2出异常,硬件出现异常,这时OS会介入,发现问题后,将对应的信号发送给相应的进程。
    在这里插入图片描述
    一个进程,出现异常大多都是将进程终止,但是man 7 signal 中,终止又两种,一个Term,一个是Core,他们有什么区别呢?以及之前在讲进程的时候,进程等待的status位图core dump标记位和这个Core的关系。
    在这里插入图片描述
    在这里插入图片描述

Core Dump

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

  • 查看core是否打开 指令:ulimit -a
    在这里插入图片描述

  • 开启Linuxcore dump功能:用ulimit命令改变这个限制,允许产生core文件。 首先用ulimit命令改变Shell进程的Resource Limit,允许core文件最大为1024K: $ ulimit -c 1024
    在这里插入图片描述
    打开过后,再运行一个除0错误的程序,会再当前工作目录中形成一个core文件(ubuntu系统),文件的名字在不同的平台不同(centos系统中就是以core.进程编号命名的)。

事后调试

gdb 可执行程序 —>core-file core 就会将相关调试信息列出(比如,在哪一行出错,出什么错)。

为什么默认的是core dump(核心转储)功能是关闭的呢
  • 有一些平台的core命名不同,如果每一个进程出现core dump后,都形成不同的core文件,那么很容将服务器的磁盘打满。

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

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

相关文章

【分数序列相加】求出一分数序列数列的前20列之和

有一分数序列&#xff1a;1/2,3/2,5/3,8/5,13/8,21/13...求出这个数列的前20列之和 #include<stdio.h>int main(){int t,number20;float a2,b1,s0;for(int i1;i<number;i){ssa/b;ta;aab;bt;}printf("%f\n",s);return 0; } 输出结果&#xff1a; 觉得有帮助…

主存编址例题

知识点 存储单元个数最大地址-最小地址1 存储单元个数BFFFFH-80000H13FFFFH140000H 这是个十六进制&#xff0c;转换为十进制4*16^44*2^4^44*2^164*2^6*2^10字节 1kb1024字节2^10字节 因此可以转换为4*2^6kb256kb 1byte8bit&#xff0c;1个字节8比特 16k*4bit16*1024*0.5…

2024.8.21 作业

一个服务器和两个客户端聊天 代码&#xff1a; /*******************************************/ 文件名&#xff1a;server.c /*******************************************/ #include <myhead.h> #define SER_IP "192.168.2.7" // 服务器IP #define SER…

防火墙的原因导致:Arduino2.x下载安装后卡在LOGO

台式机之前使用arduino1.8没什么问题&#xff0c;升级到2.x后不能用了。由于arduino1.8还是可以能够使用的&#xff0c;关键台式机不是主力就凑合的。主力机笔记本升级arduino2.x能够使用&#xff0c;没有折腾了&#xff0c;这两天有空准备&#xff0c;折腾了一天。终于成果&am…

涂料耐久性氙灯老化试验箱

涂料氙灯老化试验箱是现代检测手段中常用的一种设备&#xff0c;它能够模拟自然光照、光照老化等环境条件&#xff0c;对涂料、染料、塑料、橡胶、纺织品、涂层等材料进行老化试验&#xff0c;以评估其耐久性和使用寿命。本文将详细介绍涂料氙灯老化试验箱的工作原理、使用注意…

MCU扩容新选择——SD NAND(单片机上搭配的SPI NOR FLASH容量告急!)

目录 注意&#xff1a; 前言&#xff1a;  问题与需求&#xff1a; SD NAND方案&#xff1a; NOR 与 NAND的区别&#xff1a; 总结&#xff1a; 插播广告&#xff1a; 128MB 详情页&#xff1a; PS: 传送门&#xff1a; 退路&#xff1a; 传送门; 注意&#xff1a;…

案例分享—优秀国外界面设计配色舒适的原因

国外的UI设计师通常接受过系统的色彩理论学习&#xff0c;他们深刻理解色彩对人的心理和感知的影响。在实际设计中&#xff0c;他们运用这些知识&#xff0c;通过巧妙的色彩搭配来创造出和谐、舒适的视觉效果&#xff0c;从而提升用户体验。 国外的UI设计在色彩搭配上往往更加注…

python中取list前2位

实用工具 list [1,2,3] print(list[:2])结果输出

时间序列分析2|ARIMA模型|SARIMA模型

ARMA模型的定阶 自相关和偏自相关系数法 通过观察样本的自相关系数(ACF)和偏自相关系数(PACF)&#xff0c;进行大体的判断 模型定阶的经验方法 截尾&#xff1a; 最初的d阶样本(偏)自相关系数明显在2倍标准差范围外95%的(偏)自相关系数都落在2倍标准差的范围以内非零自相…

RAM(随机存取存储器)都有哪些?(超详细)

目录 RAM的特点 RAM的类型 1. SRAM&#xff08;静态随机存取存储器&#xff09; 2. DRAM&#xff08;动态随机存取存储器&#xff09; 3. SDRAM&#xff08;同步动态随机存取存储器&#xff09; 4. DDR SDRAM&#xff08;双倍数据速率同步动态随机存取存储器&#xff09;…

GTC2024 回顾 | 优阅达携手 Power BI 赋能企业数据洞察,助力 AI 驱动的商业智能革新

随着 AI 加入&#xff0c;Power BI 更像是一个智能分析伙伴&#xff0c;帮助全球企业在数据驱动的商业世界中取得成功。 GTC 2024 全球流量大会&#xff08;深圳&#xff09;已圆满落幕。作为中国跨境出海领域最大的盛会之一&#xff0c;大会聚焦了行业内最前沿的创新技术和跨境…

Win10将用户文件夹迁移到其它磁盘

Windows的用户文件夹放在系统盘C盘,系统使用过程中,该文件夹会不断地增加一些文件,导致C盘空间不断减少。可将C盘用户文件夹迁移到其它磁盘,以解决此问题。 1、创建临时账户 首先创建一个临时账户。右击开始菜单,选择”计算机管理“,打开本地用户和组中的用户,在空白处…

图片太大不能上传怎么压缩变小?图片压缩变小的8个方法

在当今这个高度数字化的时代&#xff0c;图片作为信息传递的重要载体&#xff0c;其上传与分享变得日益频繁。然而&#xff0c;面对网络平台或应用对文件大小的严格限制&#xff0c;一张未经处理的图片往往显得过于庞大&#xff0c;难以顺利上传。这时&#xff0c;掌握图片压缩…

nginx的代理服务器

简介 Nginx是一款高性能的开源Web服务器和反向代理服务器&#xff0c;它以其稳定性、低资源消耗以及高并发处理能力而闻名。Nginx作为代理服务器&#xff0c;主要提供两种模式的服务&#xff1a;正向代理和反向代理。 实验准备 四台虚拟机&#xff1a;一台nginx代理服务器、两台…

博途PLC手自动控制功能块(FB和FC完整SCL源代码)

PLC面向对象编程系列之手动自动控制功能块 PLC面向对象编程系列之手动自动功能块(SMART PLC)_smart功能块怎么做-CSDN博客文章浏览阅读2.2k次。本文探讨了西门子S7-200 SMART PLC在手动和自动模式下控制设备的标准功能块实现,包括子程序接口设计、STL代码简化及SCL语言的应用…

火山引擎AI创新巡展:豆包比友商便宜98%,行业落地探索,2000人座无虚席,PPT值得拍照收藏

火山引擎AI创新巡展上海站今天举行&#xff0c;现场熙熙攘攘&#xff0c;初步估计&#xff0c;现场的2000个座位让参会者一座难求&#xff0c;还有很多站着的以及没能进到会场站着听的小伙伴。 外面展区也就那样&#xff0c;虽然有很多不错的创新&#xff0c;但整个内场还是挺…

基于Yolov5的安全帽检测系统设计与开发(论文+源码)_kaic​

摘 要 安全帽检测系统的设计意义在于提高工作场所的安全性和生产效率&#xff0c;通过安全帽检测系统可以实时监控工人是否佩戴安全帽&#xff0c;及时发现不佩戴安全帽的工人并进行提醒和警示&#xff0c;避免因为不佩戴安全帽导致意外事故的发生。因此&#xff0c;本文是一个…

SAP FI模块基础操作

1. 创建利润中心组, 成本控制范围 TCODE: KCH1/KCH2 按照树的层次结构分组层层配置 2. 创建利润中心 tcode&#xff1a;KE51/KE52 可参考创建&#xff0c;在控制范围下新增利润中心。配置利润中心对应的公司代码&#xff0c;部门&#xff0c;利润中心组等 利润中心主数据表…

分类预测 | Matlab实现BES-RF秃鹰搜索算法优化随机森林多特征分类预测

分类预测 | Matlab实现BES-RF秃鹰搜索算法优化随机森林多特征分类预测 目录 分类预测 | Matlab实现BES-RF秃鹰搜索算法优化随机森林多特征分类预测效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.Matlab实现BES-RF秃鹰搜索算法优化随机森林多特征分类预测&#xff0c;…

史上最全的软件工厂考试简答题教程

软件工程考试简答题 1. 有人认为软件开发时&#xff0c;一个错误发现得越晚&#xff0c;为改正它所付出的代价越大。提出你的观点并解释原因&#xff1f; &#xff08;1&#xff09;在软件开发的不同阶段进行修改付出的代价是很不相同的&#xff0c;在早期引入变动&#xff0c…