【Linux取经路】初识信号

在这里插入图片描述

文章目录

  • 一、人眼中的信号 VS 进程眼中的信号
  • 二、ctrl+c 终止一个前台进程
  • 三、查看信号信息
    • 3.1 Core dump——核心转储功能验证
  • 四、信号的处理方式
  • 五、ctrl+c 被解释成2号信号验证
    • 5.1 signal——设置自定义捕捉方法
  • 六、ctrl+c 是如何变成信号的?
  • 七、异步、软中断
  • 八、结语

一、人眼中的信号 VS 进程眼中的信号

人眼中的信号

  • 以人为例,我们认识信号,一定是因为有人教我们,我们记住了。**认识信号包括:识别信号和知道信号的处理方法。**例如,我们可以识别红灯这个信号,并且知道红灯亮了就不能再过马路了。
  • 即便是现在没有信号产生,我们也知道产生信号后,我们应该做什么。
  • 信号产生了,我们可能并不立即处理这个信号,而是在合适的时机去处理,因为我们当前可能正在做更重要的事情,所以在信号产生后一直到信号处理前,有一个时间窗口,在这个时间窗口内,我们必须记住信号的到来

进程眼中的信号

  • 进程必须能够识别、处理信号,即使信号没有产生,也要具备处理信号的能力。信号的处理能力,属于进程内置功能的一部分。
  • 进程即便是没有收到信号,也能知道哪些信号该怎么处理。
  • 当进程真的收到了一个具体的信号的时候,进程可能并不会立即处理这个信号,在合适的时候处理。
  • 一个进程必须当信号产生了,到信号开始被处理,就一定会有时间窗口,进程具有临时保存哪些信号已经发生了的能力。

二、ctrl+c 终止一个前台进程

现象ctrl+c 可以杀掉一个前台进程。Linux 中,一次登陆中,一个终端,一般会配上一个 bash ,每一个登陆,只允许,值允许一个进程是前台进程,可以允许多个进程是后台进程。bash 也是进程,在向 bash 输入指令之前,bash 就是前台进程,此时如果在 baash 中输入一个指令 ./myprocess,以我们自己写的可执行程序为例,该程序中有一个死循环,一直向显示器打印,那么该程就会变成前台进程,bash 就会变成后台进程,此时再向 bash 中输入指令是没有任何反应的。前台进程和后台进程的一个本质区别是,谁来获取键盘输入,只有前台进程才能拿到键盘输入。./myprocess & 此时 myprocess 是一个后台进程。ctrl+c **本质是被进程解释为收到了 2 号信号。**进程收到2号信号的默认动作就是终止自己。

三、查看信号信息

pidof myprocess:显示操作系统中所有 myprocess 进程的 pid。

pidof myprocess | xargs kill -9:杀掉当前操作系统启动的所有 myprocess 进程。

kill -l:查看系统的信号列表。

image-20240307222045146

没有0、32、33号信号,一共有62个信号。1-31号称为普通信号;34-64号称为实时信号,进程一旦收到实时信号,必须立即处理。信号本质上就是数字,右边的字符是信号的名称,在操作系统的内核中,信号一定是以宏定义的方式提供的,这些宏定义在 signal.h 中可以找到。

man 7 signal:查看信号的详细说明。

image-20240308111852235

其中 TermCore 表示终止;Ign 标记忽略;Cont 表示继续;Stop 表示暂停。

在这里插入图片描述

其中 core dump 标志就是用来区分 TermCore 的。云服务器的 Core dump 功能默认是关闭的,可以通过 ulimit -a 指令来查看当前系统的所有资源限制。

image-20240308154003879

可以通过 ulimit -c size、 去设置它的大小为 size,如果 size > 0 就表示开启 Core dump 功能。

3.1 Core dump——核心转储功能验证

#include <iostream>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>using namespace std;int main()
{pid_t id = fork();if(id == 0){// childint cnt = 500;while(cnt--){cout << "I am child, my pid is: " << getpid() << endl;sleep(1);}}else if(id > 0){// fatherint status = 0;pid_t ret = waitpid(id, &status, 0);if(ret == id){cout << "wait " << id << "success, " << "exit code: " << WEXITSTATUS(status) << ", exit signalnum: " << WTERMSIG(status) << ", core dump: " << ((status >> 7)&1) << endl; }}return 0;
}

image-20240308154955145

可以看到,Term 对应的 core dump 标志位是 0;Core 对应的 core dump 标志位是 1。前者表示正常终止,后者表示异常终止。打开系统的 core dump 功能,一旦进程出现异常,操作系统会将进程在内存中的运行信息,给 dump (转储)到进程的当前目录中,形成 core.pid 文件,core dump 被称作核心转储core.pid 文件中详细记录了程序的异常原因,可以直接帮我们定位到出错行。

#include <iostream>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>using namespace std;int main()
{int a = 10;int b = 0;a /= b;return 0;
}

image-20240308160411555

四、信号的处理方式

收到信号有以下三种处理方式:

  • 默认动作:人看到红灯,默认动作就是站在原地,等待红灯结束。
  • 忽略:人看到红灯之后,不管红灯,继续往前走。
  • 自定义动作(信号的捕捉):人看到红灯后,开始唱歌。

进程收到一个信号后,它的处理动作只能在上面这三个动作中进行三选一。

五、ctrl+c 被解释成2号信号验证

5.1 signal——设置自定义捕捉方法

signal——设置进程对某个信号的自定义捕捉方法:当进程收到 signum 信号的时候,去执行 handler 方法。

image-20240307223621300

  • signum:信号的编号。
  • handler:一个函数指针,指向信号的自定义捕捉动作。
  • sighandler_t:一个函数指针类型,指向一个返回值为 void 参数为 int 的函数,这个参数值就是收到的信号。为什么要有这个参数呢?因为同一个自定捕捉方法,可以捕捉多个不同的信号,所以在该方法中需要知道是收到哪个信号才来执行的该方法。

signal 函数只需要设置一次,往后都有效。sighandler_t 函数只会在收到对应的信号后才会执行,假如程序一直没有收到对应的信号,那么该函数就一直不会被调用。

// mysignal
#include <iostream>
#include <signal.h>
#include <unistd.h>using namespace std;void myhandler(int signo)
{cout << "process get a signal: " << signo << endl;
}int main()
{signal(2, myhandler);while(true){cout << "Hello Linux" << endl;sleep(1);}return 0;
}

image-20240307224816142

进程收到信号后的默认动作和自定义捕捉动作只能执行一个,设置了自定义捕捉动作,默认动作就不再执行了。

六、ctrl+c 是如何变成信号的?

由于进程无法直接访问硬件资源,所以键盘被按下,一定是操作系统先知道的。

OS 怎么知道键盘上有数据了?

最简单的方法就是,操作系统定期的去检查键盘文件。把键盘数据读到操作系统当中,本质上是将键盘外设(文件)中的数据,拷贝到内核中的文件页缓冲区中。因为操作系统中有大量的外设,如果都采用定期检查的方法,去判断外设中是否有数据是非常浪费时间的,因此这种方法不可取。在数据层面,CPU 是不会直接和外设打交道的,但是在控制层面,当外设有数据了,外设可以给 CPU 发送硬件中断。 中断有自己的中断号,CPU 通过中断号来判断该中断是哪个外设发送的。之后 CPU 会以这个中断号为下标,去操作系统的中断向量表中执行对应的方法。 操作系统在将键盘文件中的数据拷贝到操作系统之前,会先判断输入的是数据还是控制,如果是控制,ctrl+c 就是控制,会被操作系统转换成2号信号发送给进程。

image-20240308084143944

键盘和显示器有各自独立的文件页缓冲区

image-20240308085252928

七、异步、软中断

信号的产生和代码的执行是异步的,所谓异步就是在我们代码执行的任何时候都有可能收到信号。信号是进程之间事件异步通知的一种方式,属于软中断。

八、结语

今天的分享到这里就结束啦!如果觉得文章还不错的话,可以三连支持一下,春人的主页还有很多有趣的文章,欢迎小伙伴们前去点评,您的支持就是春人前进的动力!

在这里插入图片描述

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

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

相关文章

【SQL边干边学系列】04中级问题(续)

文章目录 前言回顾中级问题25.高昂运费26.2015年的高昂运费27.高昂运维 - 使用between28.去年的高昂运费29.库存清单30.没有任何订单的客户31.没有任何订单的客户&#xff0c;员工ID为4 答案25.高昂运费26.2015年的高昂运费27.高昂运维 - 使用between28.去年的高昂运费29.库存清…

CVE-2022-4230

CVE-2022-4230 漏洞介绍 WP Statistics WordPress 插件13.2.9之前的版本不会转义参数&#xff0c;这可能允许经过身份验证的用户执行 SQL 注入攻击。默认情况下&#xff0c;具有管理选项功能 (admin) 的用户可以使用受影响的功能&#xff0c;但是该插件有一个设置允许低权限用…

DDMA信号处理以及数据处理的流程---DDMA原理介绍

Hello&#xff0c;大家好&#xff0c;我是Xiaojie&#xff0c;好久不见&#xff0c;欢迎大家能够和Xiaojie一起学习毫米波雷达知识&#xff0c;Xiaojie准备连载一个系列的文章—DDMA信号处理以及数据处理的流程&#xff0c;本系列文章将从目标生成、信号仿真、测距、测速、cfar…

vscode设置代码自动换行显示

☆ 问题描述 vscode设置代码自动换行显示 ★ 解决方案 ✅ 总结

每日两题 / 198. 打家劫舍 74. 搜索二维矩阵(LeetCode热题100)

198. 打家劫舍 - 力扣&#xff08;LeetCode&#xff09; dp[i]表示考虑前i 1号房屋&#xff0c;能获取的最大金额。对于没一间房屋都有偷与不偷两种选择 如果偷&#xff0c;需要从dp[i - 2]转移&#xff0c;因为不能偷窃相邻房屋&#xff0c;dp[i] dp[i - 2] nums[i] 如果…

稍微学学react

文章开始前&#xff0c;先划划水~ 今日份开心&#xff1a; 今天看之前发布的按钮npm包下载量有162次&#xff0c;早知道好好做了 今日份不开心&#xff1a; 爬岗位看到一个整体都挺满意的岗位&#xff0c;公司位置和发展大方向都好喜欢&#xff01;&#xff01;&#xff01;…

【PL理论】(6) F#:标准库之列表(List)

​​​​​ &#x1f4ad; 写在前面&#xff1a;本章我们将介绍 F# 标准库的列表&#xff0c;我们将简单的先过一遍列表的一些常用操作&#xff0c;具体的讲解我们将放在后续章节。 目录 0x00 标准库&#xff1a;列表&#xff08;List&#xff09; 0x01 模式匹配与列表 0x…

14.8k Star!CrewAI:部署一支由你指挥的人工智能代理大军,股票分析、发布帖子、支持Ollama!

原文链接&#xff1a;&#xff08;更好排版、视频播放、社群交流、最新AI开源项目、AI工具分享都在这个公众号&#xff01;&#xff09; 14.8k Star&#xff01;CrewAI&#xff1a;部署一支由你指挥的人工智能代理大军&#xff0c;股票分析、发布帖子、支持Ollama&#xff01;…

计算机组成结构—多处理器

目录 一、SISD、SIMD、MIMD 和向量处理器 1. 费林分类法 2. SIMD 和向量处理器 二、硬件多线程 三、多核处理器和 SMP 1. 多核处理器 2. 共享内存多处理器&#xff08;SMP&#xff09; 3. MPP 和集群 一、SISD、SIMD、MIMD 和向量处理器 通过改进系统结构&#xff0c;可…

C++设计模式-外观模式,游戏引擎管理多个子系统,反汇编

运行在VS2022&#xff0c;x86&#xff0c;Debug下。 30. 外观模式 为子系统定义一组统一的接口&#xff0c;这个高级接口会让子系统更容易被使用。应用&#xff1a;如在游戏开发中&#xff0c;游戏引擎包含多个子系统&#xff0c;如物理、渲染、粒子、UI、音频等。可以使用外观…

图像算法---自动曝光AE

一&#xff0c;自动曝光AE 自动曝光&#xff08;AE&#xff0c;全称Auto Exposure&#xff09;是一种在摄影和摄像中广泛使用的技术&#xff0c;它允许相机或摄像机根据环境光线条件自动调整曝光参数&#xff0c;以获得清晰、亮度适中的图像或视频。以下是关于自动曝光AE的详细…

31|HTTP3:甩掉TCP、TLS 的包袱,构建高效网络

前面两篇文章我们分析了HTTP/1和HTTP/2&#xff0c;在HTTP/2出现之前&#xff0c;开发者需要采取很多变通的方式来解决HTTP/1所存在的问题&#xff0c;不过HTTP/2在2018年就开始得到了大规模的应用&#xff0c;HTTP/1中存在的一大堆缺陷都得到了解决。 HTTP/2的一个核心特性是…

优卡集团冲刺港股上市:90后创始团队孵化,IPO前突击大额分红

现年26岁的鲁圳&#xff0c;正在带领其6年以来的创业成果冲击资本市场。 近日&#xff0c;金融居间机构服务商优卡集团&#xff08;Yoc Group&#xff09;向港交所递交上市申请&#xff0c;民银资本为其独家保荐人。透过招股书可知&#xff0c;优卡集团成立于2018年&#xff0…

【CTF-Web】文件上传漏洞学习笔记(ctfshow题目)

文件上传 文章目录 文件上传What is Upload-File&#xff1f;Upload-File In CTFWeb151考点&#xff1a;前端校验解题&#xff1a; Web152考点&#xff1a;后端校验要严密解题&#xff1a; Web153考点&#xff1a;后端校验 配置文件介绍解题&#xff1a; Web154考点&#xff1a…

vcruntime140.dll找不到的正确处理方法,vcruntime140.dll是什么文件

vcruntime140.dll找不到的这个问题&#xff0c;相信不少人都有遇到吧&#xff1f;其实遇到了也不需要害怕&#xff0c;这只是一个很小的问题&#xff0c;我们完全可以自己快速修复。还有就是缺失这个vcruntime140.dll文件&#xff0c;你的一些程序是会打不开的&#xff0c;不用…

揭秘!2024版Camtasia永久免费,全新功能体验

在当今数字时代&#xff0c;视频已经成为了我们生活中不可或缺的一部分。无论是在工作中进行演示、培训&#xff0c;还是在生活中分享生活点滴&#xff0c;视频都扮演着重要的角色。而要想制作出高质量的视频&#xff0c;一款专业的录屏软件是必不可少的。今天&#xff0c;我就…

PHP函数大全之array_count_values()

array_count_values()函数是用于计算数组中每个值的出现次数的PHP函数&#xff0c;并返回一个关联数组&#xff0c;该数组的键表示原始数组中的唯一值&#xff0c;而键值表示该值在原始数组中的出现次数。 array_count_values()函数的一些注意事项&#xff1a; 该函数不区分大…

美团发布2024年一季度财报:营收733亿元,同比增长25%

6月6日&#xff0c;美团(股票代码:3690.HK)发布2024年第一季度业绩报告。受益于经济持续回暖和消费复苏&#xff0c;公司各项业务继续取得稳健增长&#xff0c;营收733亿元(人民币&#xff0c;下同)&#xff0c;同比增长25%。 财报显示&#xff0c;一季度&#xff0c;美团继续…

Linux应用 sqlite3编程

1、概念 SQLite3是一个轻量级的、自包含的、基于文件的数据库管理系统&#xff0c;常用于移动设备、嵌入式设备和小型应用程序中&#xff0c;应用场景如下&#xff1a; 移动应用程序&#xff1a;由于SQLite3是零配置、无服务器的数据库引擎&#xff0c;非常适合用于移动应用程…

uni微信小程序editor富文本组件如何插入图片

需求 在editor中插入图片&#xff0c;并对图片进行编辑&#xff0c;简略看一下组件的属性&#xff0c;官网editor 组件 | uni-app官网 解决方案 首先要使用到ready这个属性&#xff0c;然后官网有给代码粘过来&#xff0c;简单解释一下这段代码的意思&#xff08;作用是在不同…