当前位置: 首页 > news >正文

Linux信号_信号的产生

信号概念

信号是进程之间事件异步通知的一种方式,属于软中断。

异步:在异步操作中,任务可以独立执行。一个任务的开始或完成不依赖于其他任务的状态。

同步:在同步操作中,任务之间的执行是相互依赖的。一个任务必须等待另一个任务完成后才能继续执行。

同步:顺序执行、可能阻塞。异步:并行执行、非阻塞。

前台进程 后台进程

前台进程:在linux下我们直接运行的进程,此时我们输入指令并不会执行,Ctrl+c可终止。

前台进程是用户当前正在交互的进程,通常在用户的终端或窗口中运行。

后台进程:在命令后加上&将进程放入后台 eg.command &

此时我们输入指令并可以执行,Ctrl+c不可终止。

后台进程是在用户不直接交互的情况下运行的进程。

关闭后台进程方法:
1.向后台进程发送信号,eg.kill -9 后台进程id

fg命令后台运行的作业调回前台

2.fg id将一个在后台运行的作业调回前台。再Ctrl+c:向前台进程发送2 SIGINT 信号

常见信号:

1~31信号编号

在 Unix 和 Linux 系统中,信号是一种用于通知进程某种事件发生的机制。每个信号都有一个唯一的编号,进程可以通过这些编号来处理特定的事件或执行特定的操作。

信号编号是操作系统用来标识不同信号的整数值。

例如,当你按下 Ctrl+C 时,系统会向当前运行的进程发送一个中断信号(SIGINT),其信号编号为 2。程序可以选择捕获这个信号并执行自定义的处理逻辑,或者默认终止进程。

我们发送信号,进程不一定会立即处理信号,而是在合适的时机处理信号。进程在哪里保存信号呢?

在进程对应PCB中的信号位图里我们向进程发送信号,其实是修改对应进程PCB中的信号位图,修改bit位0->1 

kill -l查看系统支持的信号列表

信号编号	信号名称	描述
1	SIGHUP	终端挂断信号
2	SIGINT	中断信号(通常由 Ctrl+C 产生)
3	SIGQUIT	退出信号(通常由 Ctrl+\ 产生)
4	SIGILL	非法指令信号
5	SIGTRAP	跟踪陷阱信号
6	SIGABRT	异常终止信号
7	SIGBUS	总线错误信号
8	SIGFPE	浮点异常信号
9	SIGKILL	强制终止信号(不可被捕获或忽略)
10	SIGUSR1	用户定义信号 1
11	SIGSEGV	段错误信号
12	SIGUSR2	用户定义信号 2
13	SIGPIPE	管道破裂信号
14	SIGALRM	定时器到期信号
15	SIGTERM	终止信号
16	SIGSTKFLT	堆栈故障信号
17	SIGCHLD	子进程状态改变信号
18	SIGCONT	继续执行信号
19	SIGSTOP	停止进程信号(不可被捕获或忽略)
20	SIGTSTP	停止信号(通常由 Ctrl+Z 产生)
21	SIGTTIN	后台进程试图读取终端信号
22	SIGTTOU	后台进程试图写入终端信号
23	SIGURG	紧急数据到达信号
24	SIGXCPU	超过 CPU 时间限制信号
25	SIGXFSZ	超过文件大小限制信号
26	SIGVTALRM	虚拟定时器到期信号
27	SIGPROF	统计定时器到期信号
28	SIGWINCH	窗口大小变化信号
29	SIGIO	I/O 可用信号
30	SIGPWR	电源故障信号
31	SIGSYS	Bad system call(错误的系统调用)
信号如 -9  SIGKILL 和 -19  SIGSTOP 是不可被捕获或忽略的。

signal() 重新定义在接收到特定信号时应采取的行为

void (*signal(int signum, void (*handler)(int)))(int);

参数

  • signum:要捕获的信号编号,例如 SIGINTSIGTERM 等。
  • handler:指向信号处理函数的指针。(SIG_DFL (默认处理) SIG_IGN (忽略信号))
  • #include<signal.h>
    #define SIG_DFL ((void (*)(int)) 0)  // 默认处理
    #define SIG_IGN ((void (*)(int)) 1)  // 忽略信号
    

void (*handler)(int) handler是一个函数指针,表示接收一个参数为一个int的函数,返回值类型是void。(int参数是接收到的信号编号。)

返回值

  • 返回值是先前的处理函数的地址(如果有),或者返回 SIG_ERR 表示出错。

signal()用法

我们知道ctrl+c是向前台进程发送2 SIGINT 中断信号,进程获取到信号执行默认行为(系统定义的行为 终止)。

我们接收到2信号,但不想让它执行默认行为。我们可以直接实现一个void (int) 返回值无 参数一个int(用于接收信号编号)的函数,里面是我们想实现的行为。

把它当作signal()的第二个参数回调函数,第一个参数和回调函数的int参数一样,是要捕捉的信号编号。这样我们就可以把对应信号执行默认行为该为执行我们定义的行为。

信号如 -9 SIGKILL 和 -19 SIGSTOP 是不可被捕获或忽略的。所有-9 -19是不能被signal()重新定义的。

产生信号的5种方式

1.系统指令 kill

系统指令可以发送信号

eg.kill -9 id 

2.系统函数 kill() raise() abort()

一个进程可以使用 kill() 函数向另一个进程发送信号。

pid_t pid目标进程pid  int sig 要发送信号的编号

#include <signal.h>
#include <unistd.h>int kill(pid_t pid, int sig);

成功时返回 0。
失败时返回 -1,并设置 errno。

raise() 函数用于向当前进程(自己)发送一个信号。

sig 要发送信号的编号

#include <signal.h>int raise(int sig);

成功时返回 0。
失败时返回 -1,并设置 errno。

abort() 函数给自己发送 SIGABRT 信号,用于立即终止当前进程,并生成一个核心转储(core dump),这有助于后续调试。

#include <stdlib.h>void abort(void);

3.键盘 ctrl+c/z

特定的用户操作也会产生信号。例如:
用户在终端按下 Ctrl+C 时,通常会向正在运行的进程发送 SIGINT 信号。
用户按 Ctrl+Z 时,进程会接收到 SIGTSTP 信号,使其暂停执行。

4.软件条件

定时器或闹钟 alarm()

进程可以使用定时器(如 alarm()、setitimer())来产生信号。

alarm ()使得在指定的秒数后发送一个 14 SIGALRM 信号到当前进程。

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

seconds 表示设置的秒数 返回值为剩余的秒数。

int n=alarm(0);

表示取消当前进程的定时器,n表示之前设置的剩余秒数。如果没有设置过定时器,则返回 0。

5.异常

在C++中,我们访问野指针,/0等操作会让进程崩溃。其实是系统给进程发送对应的信号,导致进程的退出。

系统内核会在特定条件下自动向进程发送信号。

例如:
1.当进程除以零时,会发送 SIGFPE 信号。
2.当进程尝试访问无效内存时,会发送 SIGSEGV 信号。
3.当进程超出资源限制时,会发送 SIGXCPU 或 SIGXFSZ 信号。

我们知道当进程除以零时,会发送 SIGFPE 信号,如果我们signal()重新定义SIGFPE信号对应的行为,不让它终止,每接收到一次SIGFPE 信号就打印,但不终止。

可以看到程序会一直打印,意味着系统会一直给进程发送SIGFPE 信号。为什么?

在执行除法操作之前,CPU 会检查除数寄存器的值。如果发现除数为零,CPU 不会执行实际的除法运算。CPU 会生成一个异常信号,并中断当前的指令执行。

但我们重新定义的该信号的行为,导致进程没有被杀。但cpu不会一直运行这个程序,会进行轮转,等到再次调度该进程,发现又是/0操作再成一个异常信号。这样就会表现出系统一直给该进程发送信号的景象。

Core和Term

Core和Term是进程退出行为,但它们有什么不同?

Term: 一般是指正常的进程终止(通常是通过接收到 SIGTERM 信号)。

Core:当进程由于接收到 SIGSEGV、SIGABRT、SIGQUIT 等信号而崩溃时,操作系统可以在当前目录下生成一个核心转储文件。这个文件包含了进程的内存映像和状态,可以用于调试崩溃原因。最后进程终止。

核心转储文件的文件名一般是core,有的版本下会在后面加该进程的id。坏处是如果不解决问题,每次运行该进程都会生成core.id文件,因为每次进程运行的id不同,core文件名不同就会生成内容重复的文件。导致磁盘空间的浪费

core文件作用

核心文件可以与调试器(如 gdb)结合使用,以分析崩溃时程序的状态。

输出因为什么崩溃的,在哪一行。

core dump标志

还记得pid_t waitpid (pid_t pid, int *status, int options),中status是一个位图,带回子进程的退出信息,里面有一个字节是core dump标志吗?

如果接收到的是SIGSEGV、SIGABRT、SIGQUIT等信号core dump标志就会置为1,生成core文件

相关文章:

Linux信号_信号的产生

信号概念 信号是进程之间事件异步通知的一种方式&#xff0c;属于软中断。 异步&#xff1a;在异步操作中&#xff0c;任务可以独立执行。一个任务的开始或完成不依赖于其他任务的状态。 同步&#xff1a;在同步操作中&#xff0c;任务之间的执行是相互依赖的。一个任务必须等待…...

数据库基础(7) . DML-基本操作

3.3.DML DML 是 “Data Manipulation Language”&#xff08;数据操作语言&#xff09;的缩写&#xff0c;在数据库管理系统&#xff08;DBMS&#xff09;中用来处理已存在的数据库中的数据。 它主要包含用于插入&#xff08;INSERT&#xff09;、更新&#xff08;UPDATE&…...

windows运行ffmpeg的脚本报错:av_ts2str、av_ts2timestr、av_err2str => E0029 C4576

问题描述 我目前的环境是&#xff1a; 编辑器&#xff1a; Microsoft Visual Studio Community 2022 (64 位) 运行的脚本是ffmpeg自带的remux样例&#xff0c;只不过我想用c语言执行这个样例。在执行的过程中报错如下图&#xff1a; C4576 后跟初始值设定项列表的带圆括…...

[mysql]mysql的DML数据操作语言增删改,以及新特性计算列,阿里巴巴开发手册mysql相关

1DML数据操作语言,增加删除改数据 插入数据INSERT 插入添加数据,两种方法 方式1:VALUES添加数据 #准备工作 USE atguigudb; CREATE TABLE IF NOT EXISTS emp1( id INT, name VARCHAR(15), hire_data DATE, salary DOUBLE(10,2)); SELECT * FROM emp1 INSERT INTO em…...

Github 2024-11-07 Go开源项目日报 Top10

根据Github Trendings的统计,今日(2024-11-07统计)共有10个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量Go项目10HTML项目1Kubernetes: 容器化应用程序管理系统 创建周期:3618 天开发语言:Go协议类型:Apache License 2.0Star数量:106913 个Fork数…...

【黑盒测试】等价类划分法及实例

本文主要介绍黑盒测试之等价类划分法&#xff0c;如什么是等价类划分法&#xff0c;以及如何划分&#xff0c;设计等价类表。以及关于三角形案例的等价类划分法。 文章目录 一、什么是等价类划分法 二、划分等价类和列出等价类表 三、确定等价类的原则 四、建立等价类表 …...

LeetCode17. 电话号码的字母组合(2024秋季每日一题 59)

给定一个仅包含数字 2-9 的字符串&#xff0c;返回所有它能表示的字母组合。答案可以按 任意顺序 返回。 给出数字到字母的映射如下&#xff08;与电话按键相同&#xff09;。注意 1 不对应任何字母。 示例 1&#xff1a; 输入&#xff1a;digits “23” 输出&#xff1a;[“…...

SQLite数据库是什么?DB Browser for SQLite是什么?

‌SQLite是一个轻量级的嵌入式数据库&#xff0c;它是一个遵守ACID原则的关系型数据库管理系统‌。SQLite的主要特点是占用资源少、无需配置、支持多种操作系统和编程语言&#xff0c;并且具有高性能和跨平台特性。 SQLite的基本概念和特性 ‌轻量级‌&#xff1a;SQLite的数据…...

核心概念解析Caffeine 缓存模型与策略

1. 简介 什么是 Caffeine Caffeine 是一个高性能的 Java 缓存库&#xff0c;专为提高内存缓存的效率和灵活性而设计。它由 Google 的 Guava Cache 项目启发&#xff0c;并提供了更高的性能和更丰富的功能集。Caffeine 以其卓越的缓存命中率和内存管理能力而广受欢迎&#xff…...

ubuntu 22.04 防火墙

Ubuntu&#xff08;22.04&#xff09;云主机SSH安全加固 https://blog.csdn.net/qq_44846097/article/details/141098092 ubuntu22.04防火墙策略 https://blog.csdn.net/sunyuhua_keyboard/article/details/139493464 Ubuntu 22.04 防火墙设置和开放端口命令 https://blog.c…...

【数据结构-合法括号字符串】力扣678. 有效的括号字符串

给你一个只包含三种字符的字符串&#xff0c;支持的字符类型分别是 ‘(’、‘)’ 和 ‘*’。请你检验这个字符串是否为有效字符串&#xff0c;如果是 有效 字符串返回 true 。 有效 字符串符合如下规则&#xff1a; 任何左括号 ‘(’ 必须有相应的右括号 ‘)’。 任何右括号 …...

ThreadX在STM32上的移植:F1,F4通用启动文件tx_initialize_low_level.s

在嵌入式系统开发中&#xff0c;实时操作系统&#xff08;RTOS&#xff09;的选择对于系统性能和稳定性至关重要。ThreadX是一种广泛使用的RTOS&#xff0c;它以其小巧、快速和可靠而闻名。在本文中&#xff0c;我们将探讨如何将ThreadX移植到STM32微控制器上&#xff0c;特别是…...

【算法】递归+深搜:814.二叉树剪枝

目录 1、题目链接 2、题目 3、解法(后序遍历) 4、代码 1、题目链接 814.二叉树剪枝&#xff08;LeetCode&#xff09; 2、题目 3、解法(后序遍历) 我们这次不使用宏观的观察法&#xff0c;而是从具体实现开始。 题目要求我们&#xff0c;去掉不含1的子树。 对于子树这个…...

spring Framework 特定条件下目录遍历漏洞(CVE-2024-38816)修复

spring Framework 特定条件下目录遍历漏洞&#xff08;CVE-2024-38816&#xff09;修复 漏洞描述 CVE-2024-38816: Path traversal vulnerability in functional web frameworks 通过功能性 Web 框架 WebMvc.fn 或 WebFlux.fn 提供静态资源的应用程序容易受到路径遍历攻击。攻…...

ESP32-C3 入门笔记03:VScode + flash_download_tool 下载烧录程序(ESP-IDF + PlatformIO)

ESP32-C3 支持多种烧录方式&#xff0c;主要包括以下几种&#xff1a; VS Code 串口烧录&#xff1a;使用 VS Code 配合 PlatformIO 或 ESP-IDF 插件进行串口烧录。串口连接通常使用 UART 接口&#xff0c;通过 USB 转串口芯片与电脑连接。步骤大致如下&#xff1a; 配置 VS Co…...

Node.js——fs模块-文件重命名和移动

1、在Node.js中&#xff0c;我们可以使用 rename 或 renameSync 来移动或重命名文件或文件夹 2、语法&#xff1a; fs.rename(oldPath,newPath,callback) fs.renameSync(oldPath,newPath) 参数说明&#xff1a; oldPath 文件当前的路径 newPath 文件新的路径 callback 操…...

vue2.0版本引入Element-ui问题解决

作者&#xff1a;fyupeng 技术专栏&#xff1a;☞ https://github.com/fyupeng 项目地址&#xff1a;☞ https://github.com/fyupeng/distributed-blog-system-api 留给读者 使用版本&#xff1a; vue:2.6.14 element-ui:2.15.14 一、问题及解决 1、安装后组件没有生效&#x…...

qt QTableView详解

1、概述 QTableView 是 Qt 框架中的一个高级视图类&#xff0c;用于以表格形式展示二维数据。它基于 QAbstractItemView&#xff0c;并与模型&#xff08;通常是 QAbstractTableModel 或 QStandardItemModel&#xff09;结合使用&#xff0c;以实现数据的展示和交互。QTableVi…...

将Notepad++添加到右键菜单【一招实现】

一键添加注册表 复制以下代码保存为 Notepad.reg&#xff0c;将红框内路径修改为自己电脑的“Notepad.exe路径”后&#xff0c;再双击运行即可。 Windows Registry Editor Version 5.00[HKEY_CLASSES_ROOT\*\shell\NotePad] "Notepad" "Icon""D:\\N…...

Nature Methods | 基于流形约束的RNA速度推断精准解析细胞周期动态调节规律

生信碱移 VeloCycle算法 VeloCycle&#xff1a;基于流形约束的RNA速度推断在细胞周期动态中的精准解析 今天给各位老铁们分享一篇于2024年10月31号发表在 Nature Methods [IF: 36.1] 的文章&#xff1a;"Statistical inference with a manifold-constrained RNA velocity…...

生成xcframework

打包 XCFramework 的方法 XCFramework 是苹果推出的一种多平台二进制分发格式&#xff0c;可以包含多个架构和平台的代码。打包 XCFramework 通常用于分发库或框架。 使用 Xcode 命令行工具打包 通过 xcodebuild 命令可以打包 XCFramework。确保项目已经配置好需要支持的平台…...

论文解读:交大港大上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(二)

HoST框架核心实现方法详解 - 论文深度解读(第二部分) 《Learning Humanoid Standing-up Control across Diverse Postures》 系列文章: 论文深度解读 + 算法与代码分析(二) 作者机构: 上海AI Lab, 上海交通大学, 香港大学, 浙江大学, 香港中文大学 论文主题: 人形机器人…...

黑马Mybatis

Mybatis 表现层&#xff1a;页面展示 业务层&#xff1a;逻辑处理 持久层&#xff1a;持久数据化保存 在这里插入图片描述 Mybatis快速入门 ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/6501c2109c4442118ceb6014725e48e4.png //logback.xml <?xml ver…...

MySQL 隔离级别:脏读、幻读及不可重复读的原理与示例

一、MySQL 隔离级别 MySQL 提供了四种隔离级别,用于控制事务之间的并发访问以及数据的可见性,不同隔离级别对脏读、幻读、不可重复读这几种并发数据问题有着不同的处理方式,具体如下: 隔离级别脏读不可重复读幻读性能特点及锁机制读未提交(READ UNCOMMITTED)允许出现允许…...

全球首个30米分辨率湿地数据集(2000—2022)

数据简介 今天我们分享的数据是全球30米分辨率湿地数据集&#xff0c;包含8种湿地亚类&#xff0c;该数据以0.5X0.5的瓦片存储&#xff0c;我们整理了所有属于中国的瓦片名称与其对应省份&#xff0c;方便大家研究使用。 该数据集作为全球首个30米分辨率、覆盖2000–2022年时间…...

基于数字孪生的水厂可视化平台建设:架构与实践

分享大纲&#xff1a; 1、数字孪生水厂可视化平台建设背景 2、数字孪生水厂可视化平台建设架构 3、数字孪生水厂可视化平台建设成效 近几年&#xff0c;数字孪生水厂的建设开展的如火如荼。作为提升水厂管理效率、优化资源的调度手段&#xff0c;基于数字孪生的水厂可视化平台的…...

第25节 Node.js 断言测试

Node.js的assert模块主要用于编写程序的单元测试时使用&#xff0c;通过断言可以提早发现和排查出错误。 稳定性: 5 - 锁定 这个模块可用于应用的单元测试&#xff0c;通过 require(assert) 可以使用这个模块。 assert.fail(actual, expected, message, operator) 使用参数…...

微信小程序云开发平台MySQL的连接方式

注&#xff1a;微信小程序云开发平台指的是腾讯云开发 先给结论&#xff1a;微信小程序云开发平台的MySQL&#xff0c;无法通过获取数据库连接信息的方式进行连接&#xff0c;连接只能通过云开发的SDK连接&#xff0c;具体要参考官方文档&#xff1a; 为什么&#xff1f; 因为…...

CVE-2020-17519源码分析与漏洞复现(Flink 任意文件读取)

漏洞概览 漏洞名称&#xff1a;Apache Flink REST API 任意文件读取漏洞CVE编号&#xff1a;CVE-2020-17519CVSS评分&#xff1a;7.5影响版本&#xff1a;Apache Flink 1.11.0、1.11.1、1.11.2修复版本&#xff1a;≥ 1.11.3 或 ≥ 1.12.0漏洞类型&#xff1a;路径遍历&#x…...

AirSim/Cosys-AirSim 游戏开发(四)外部固定位置监控相机

这个博客介绍了如何通过 settings.json 文件添加一个无人机外的 固定位置监控相机&#xff0c;因为在使用过程中发现 Airsim 对外部监控相机的描述模糊&#xff0c;而 Cosys-Airsim 在官方文档中没有提供外部监控相机设置&#xff0c;最后在源码示例中找到了&#xff0c;所以感…...