【Linux】:信号的产生
信号
- 一.前台进程和后台进程
- 1.前台进程
- 2。后台进程
- 3.总结
- 二.自定义信号动作接口
- 三.信号的产生
- 1.键盘组合键
- 2.kill+信号+进程pid
- 3.系统调用
- 1.kill函数
- 2.raise函数
- 3.abort函数
- 四.异常
- 五.软件条件
- 六.通过终端按键产生信号

一.前台进程和后台进程
1.前台进程
一个简单的代码演示


像这种程序在运行时,不能执行其他命令并且可以被ctrl+c终止的进程被称为前台进程。
2。后台进程
我们另外打开一个窗口,在另一个窗口运行程序。

这样在当前进程我们依然可以使用各种命令,但是该进程不能被ctrl+c终止,这样的进程被称为后台进程。
前台进程加个&也能变成后台进程。

可以通过进程的pid使用kill直接终止。

3.总结
Linux中,一次登陆中,一个终端,一般会配上一个bash,每一个登陆,只允许一个进程是前台进程,可以允许多个进程是后台进程。两者的本质区别就是谁来获取键盘输入。
为什么使用Ctrl c能将前台进程终止呢?就是因为前台进程能够读取到键盘输入,而ctrl c的本质就是发送一个2号信号。

我们把1到31号信号称为普通信号(产生后不必立即处理),后面的称为实时信号(一旦产生必须处理)。下面我们只对普通信号进行讨论。
信号的处理方式一般有三种:
1.默认处理 (例如2号信号的默认动作就是终止自己)
2.忽略信号
3.自定义方式(信号捕捉)。
二.自定义信号动作接口

第一个参数:指定要进行自定义的信号。
第二个参数:一个函数,要自定义的动作,该函数的返回值是void,参数表示该信号。
例如:2号信号默认是终止,接下来把它更改一下


注意:
-
Ctrl-C 产生的信号只能发给前台进程。一个命令后面加个&可以放到后台运行,这样Shell不必等待进程结束就可以接受新的命令,启动新的进程。
-
Shell可以同时运行一个前台进程和任意多个后台进程,只有前台进程才能接到像 Ctrl-C 这种控制键产生的信号。
-
前台进程在运行过程中用户随时可能按下 Ctrl-C 而产生一个信号,也就是说该进程的用户空间代码执行到任何地方都有可能收到 SIGINT 信号而终止,所以信号相对于进程的控制流程来说是异步(Asynchronous)的。
-
为什么操作系统能够读到ctrl+c呢?因为cpu实际上与键盘的一部分是直接相连的,当键盘开始输入时就会直接向CPU发送一个硬件中断,然后CPU就会让操作系统来读取键盘的输入,最后将输入内容进行相应的解读。
三.信号的产生
1.键盘组合键
上面已经介绍了ctrl+c—>信号2。这就是一种键盘组合键
ctrl+\ ->信号3


ctrl+z->19号


可以看到它并没有如我们预期那样打印,说明它是不能被捕捉的。
所以不是所有信号都能被捕捉。
2.kill+信号+进程pid
我们经常使用kill+进程pid终止程序,kill也常用来给进程发送信号,例如接下来给进程分别发送1,2,3信号。



3.系统调用
1.kill函数
系统调用函数也可以直接发送命令。

示例

另外创建一个死循环程序,用该程序终止。


2.raise函数



3.abort函数

它是引起一个正常的进程直接终止。给自己发一个6号信号。

四.异常
一个程序发生异常本质上是收到了信号。
各种异常


很明显出现了异常并且只打印出了上面一句话,后面并没有进行打印。实际上这是接收了8号信号。


这是一个最常见的段错误。它收到了11号信号。
原因
注意任何异常都只能给当前进程造成影响,不会波及其他进程。
为什么/0和野指针会导致进程崩溃呢?这是因为当运行这种代码时,会给进程发送异常信号,导致进程崩溃。
为什么/0和野指针会给进程发送信号呢?在CPU里有一个寄存器叫状态寄存器,在状态寄存器里有一个溢出标志位,当在做/0操作时,那么就直接溢出了,而溢出标志位就由0变为1,从而被操作系统识别,之后操作系统就能对信息做出处理。
那么野指针呢?在操作系统里有一个页表用来转换虚拟地址和物理地址,而野指针就是地址转换失败。一旦失败,就会把失败地址传回CPU寄存器里。
总结:操作系统怎么知道是溢出异常还是段错误呢?本质就是因为不同的报错对应的是不同CPU寄存器(硬件)的报错。
五.软件条件
异常只会由硬件产生吗?答案是当然不是。
还记得管道吗?一个进程进行写入,另一个进程进行读取。如果我们将读端关掉,那么写端也会关闭并且会发送13号信号。这其实就算一种软件异常。
alarm



六.通过终端按键产生信号


一个进程在使用wait退出时会返回对应退出码(8-15位),而进程异常会收到退出信号(0-6位),第7位是coredum,它表示进程在终止的时候表示是core终止方式还是term终止方式。

core

term(以2号信号终止)

我们发现两者的core位都是0,怎么回事呢?其实是云服务器上的core功能默认是关闭的。
查看

开启core


在这之后形成了一个core文件。

core文件里会记录具体哪一行代码出现错误。直接使用gdb就可以调试。
信号发送其实本质上是给进程的PCB发。

相关文章:
【Linux】:信号的产生
信号 一.前台进程和后台进程1.前台进程2。后台进程3.总结 二.自定义信号动作接口三.信号的产生1.键盘组合键2.kill信号进程pid3.系统调用1.kill函数2.raise函数3.abort函数 四.异常五.软件条件六.通过终端按键产生信号 一.前台进程和后台进程 1.前台进程 一个简单的代码演示 …...
document load 和 document ready 的区别
"document load" 和 "document ready" 都是 JavaScript 中用于处理文档加载事件的术语,但是它们之间有一些重要的区别。 document load 在传统的 JavaScript 中,document.load 事件是当整个 HTML 文档完全加载并出现在浏览器中时触…...
flutter与原生Android通信方式之MethodChannel
闲来无事,flutter好久没看了,上次折腾flutter与Android通信没折腾完,有些事情耽搁了,这次继续 演示效果: flutter与Android原生通信 flutter端 import package:flutter/cupertino.dart; import package:flutter/mater…...
[PyTorch][chapter 66][强化学习-值函数近似]
前言 现实强化学习任务面临的状态空间往往是连续的,无穷多个。 这里主要针对这种连续的状态空间处理。后面DQN 也是这种处理思路。 目录: 1: 原理 2: 梯度更新 3: target 和 预测值 4 流程 一 原理 强化学习最重要的是得到 …...
hdlbits系列verilog解答(Exams/m2014 q4e)-46
文章目录 一、问题描述二、verilog源码三、仿真结果 一、问题描述 实现以下电路: 二、verilog源码 module top_module (input in1,input in2,output out);assign out ~(in1 | in2);endmodule三、仿真结果 转载请注明出处!...
小程序如何实现下拉刷新?
一、全局下拉刷新 在app.json的window节点中,将enablePullDownRefresh设置为true; onPullDownRefresh: function () {console.log(下拉刷新);// 在这里编写数据更新的逻辑wx.stopPullDownRefresh(); // 数据更新完成后,调用该方法停止刷新}二…...
二进制数据转换成十六进制表示 binascii.hexlify()
【小白从小学Python、C、Java】 【计算机等考500强证书考研】 【Python-数据分析】 二进制数据转换成十六进制表示 binascii.hexlify() 选择题 binascii.hexlify()参数的数据类型可以是? import binascii number 11 byte_data number.to_bytes() hex_data bin…...
苍穹外卖--店铺营业状态设置
需求分析和设计 1.1.1 产品原型 进到苍穹外卖后台,显示餐厅的营业状态,营业状态分为营业中和打烊中,若当前餐厅处于营业状态,自动接收任何订单,客户可在小程序进行下单操作;若当前餐厅处于打烊状态&#…...
2023金盾杯线上赛-AGRT战队-WP
目录 WEB ApeCoin get_source ezupload easyphp MISC 来都来了 芙宁娜 Honor Crypto 我看看谁还不会RSA hakiehs babyrsa PWN sign-format RE Re1 WEB ApeCoin 扫描发现有源码泄露,访问www.tar.gz得到源码。 在源码中发现了冰蝎马。 Md5解码&am…...
Python面向对象编程——类方法、实例方法和静态方法总结
在Python面向对象编程中,类方法(class methods)、实例方法(instance methods)和静态方法(static methods)是不同类型的方法,它们有一些联系,但也存在一些明显的区别。 类…...
HarmonyOS开发(五):常用基础组件
1、组件介绍 组件(Component),是界面搭建及显示的最小单元。 组件根据功能可以分为五大类:基础组件、容器组件、媒体组件、绘制组件、画布组件 2、基础组件 基础组件是视图层的基本组成单元,它包含:Text、Image、T…...
Hive中常出现的错误(不定时更新)
1.加载数据失败 hive> load data local inpath /home/user/hive.txt into table studentl> ; FAILED: SemanticException [Error 10001]: Line 1:56 Table not found studentl hive> load data local inpath /home/user/hive.txt into table student; Loading data to…...
c++ 重写 多态
1 重写(继承后(拼接基类后)) 1.1 非虚函数 同名成员函数 (各自有一个xFunction() 内存 ) #include <iostream> #include <String> class BaseClass { public:void xFunction() {std::cout << "BaseClass::xFunction()\n"; } };class Subclass1 …...
Git如何修改提交(commit)用户名称(user.name)和邮箱(user.email)
Git用户名 Git查看用户名 git config user.name修改Git提交用户名 修改全局Git用户名 git config --global user.name "xx" 修改当前服务/项目Git用户名 git config user.name "xx"如果出现以下错误,解决方案如下: 错误案例&am…...
知行之桥EDI系统HTTP签名验证
本文简要概述如何在知行之桥EDI系统中使用 HTTP 签名身份验证,并将使用 CyberSource 作为该集成的示例。 API 概述 首字母缩略词 API 代表“应用程序编程接口”。这听起来可能很复杂,但真正归结为 API 是一种允许两个不同实体相互通信的软件。自开发以…...
C++ DAY08 异常
概念 异常事件(如:除 0 溢出,数组下标越界,所要读取的文件不存在 , 空指针,内存不足 等等) 在 C 语言对错误的处理是两种方法: 一是使用整型的返回值标识错误; 二是使用 errn…...
vscode导入STM32CubeIDE工程文件夹未定义警告清除方法
0 前言 在我们使用vscode去编辑STM32CubeIDE的工程文件时,经常会出现一些类型未定义、头文件路径无效的问题,无法正常使用且非常影响观感。本文介绍如何设置vscode导入的STM32CubeIDE配置文件,解决这一问题。 1 vscode导入STM32CubeIDE工程…...
SparkSQL之Optimized LogicalPlan生成过程
经过Analyzer的处理,Unresolved LogicalPlan已经解析成为Analyzed LogicalPlan。Analyzed LogicalPlan中自底向上节点分别对应Relation、Subquery、Filter和Project算子。 Analyzed LogicalPlan基本上是根据Unresolved LogicalPlan一对一转换过来的,…...
Java中有几种基本数据类型以及转换方式【Java面经(1)】
问:Java中有几种基本数据类型呢?以及它们之间的转换方式。详细介绍下 总共有8种基本数据类型 byte 、short 、long 、float 、double 、boolean 、char 详细类型以及字节数: 基本数据类型的转换方式 自动类型转换:小–>大 byt…...
JVM虚拟机:JVM调优第一步,了解JVM常用命令行参数
本文重点 从本文课程开始,我们将用几篇文章来介绍JVM中常用的命令行的参数,这个非常重要,第一我们可以通过参数了解JVM的配置,第二我们可以通过参数完成对JVM的调参。以及后面的JVM的调优也需要用到这些参数,所以我们…...
国防科技大学计算机基础课程笔记02信息编码
1.机内码和国标码 国标码就是我们非常熟悉的这个GB2312,但是因为都是16进制,因此这个了16进制的数据既可以翻译成为这个机器码,也可以翻译成为这个国标码,所以这个时候很容易会出现这个歧义的情况; 因此,我们的这个国…...
JavaSec-RCE
简介 RCE(Remote Code Execution),可以分为:命令注入(Command Injection)、代码注入(Code Injection) 代码注入 1.漏洞场景:Groovy代码注入 Groovy是一种基于JVM的动态语言,语法简洁,支持闭包、动态类型和Java互操作性,…...
大数据学习栈记——Neo4j的安装与使用
本文介绍图数据库Neofj的安装与使用,操作系统:Ubuntu24.04,Neofj版本:2025.04.0。 Apt安装 Neofj可以进行官网安装:Neo4j Deployment Center - Graph Database & Analytics 我这里安装是添加软件源的方法 最新版…...
Debian系统简介
目录 Debian系统介绍 Debian版本介绍 Debian软件源介绍 软件包管理工具dpkg dpkg核心指令详解 安装软件包 卸载软件包 查询软件包状态 验证软件包完整性 手动处理依赖关系 dpkg vs apt Debian系统介绍 Debian 和 Ubuntu 都是基于 Debian内核 的 Linux 发行版ÿ…...
在rocky linux 9.5上在线安装 docker
前面是指南,后面是日志 sudo dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo sudo dnf install docker-ce docker-ce-cli containerd.io -y docker version sudo systemctl start docker sudo systemctl status docker …...
AtCoder 第409场初级竞赛 A~E题解
A Conflict 【题目链接】 原题链接:A - Conflict 【考点】 枚举 【题目大意】 找到是否有两人都想要的物品。 【解析】 遍历两端字符串,只有在同时为 o 时输出 Yes 并结束程序,否则输出 No。 【难度】 GESP三级 【代码参考】 #i…...
微信小程序云开发平台MySQL的连接方式
注:微信小程序云开发平台指的是腾讯云开发 先给结论:微信小程序云开发平台的MySQL,无法通过获取数据库连接信息的方式进行连接,连接只能通过云开发的SDK连接,具体要参考官方文档: 为什么? 因为…...
selenium学习实战【Python爬虫】
selenium学习实战【Python爬虫】 文章目录 selenium学习实战【Python爬虫】一、声明二、学习目标三、安装依赖3.1 安装selenium库3.2 安装浏览器驱动3.2.1 查看Edge版本3.2.2 驱动安装 四、代码讲解4.1 配置浏览器4.2 加载更多4.3 寻找内容4.4 完整代码 五、报告文件爬取5.1 提…...
蓝桥杯3498 01串的熵
问题描述 对于一个长度为 23333333的 01 串, 如果其信息熵为 11625907.5798, 且 0 出现次数比 1 少, 那么这个 01 串中 0 出现了多少次? #include<iostream> #include<cmath> using namespace std;int n 23333333;int main() {//枚举 0 出现的次数//因…...
OPenCV CUDA模块图像处理-----对图像执行 均值漂移滤波(Mean Shift Filtering)函数meanShiftFiltering()
操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 在 GPU 上对图像执行 均值漂移滤波(Mean Shift Filtering),用于图像分割或平滑处理。 该函数将输入图像中的…...
