Linux信号_信号的产生

news2024/12/28 15:48:28

信号概念

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

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

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

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

前台进程 后台进程

前台进程:在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文件

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

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

相关文章

Docker学习—Docker核心概念总结

核心概念总结 容器&#xff1a;容器就是将应用运行所需的所有内容比如代码、运行时环境&#xff0c;进行打包和隔离。 容器和虚拟机的对比 虚拟机是在同一个硬件上虚拟化出多个操作系统&#xff08;OS&#xff09;实例。 容器是在操作系统上进行虚拟化&#xff0c;用于隔离…

51单片机教程(六)- LED流水灯

1 项目分析 基于点亮LED灯、LED灯闪烁&#xff0c;扩展到构成最简单、花样流水灯。 2 技术准备 1 流水灯硬件及原理图 流水灯是由多个LED灯组成的 2 C语言知识点 数组 数组声明&#xff1a;长度不可变 数据类型 数组名称[长度n] // 整数型默认为0&#xff0c;小数型默认…

供热的一些基础技术数据

1、应该了解的几个实用数据:(1)室内采暖达标温度182℃(2)建筑面积采暖热负荷 4060kcal/h㎡(4570W/㎡)(3)建筑面积采暖所需合理流量 2.53.5kg/h㎡(节能建筑12 kg/h㎡)(4)一次网严寒期外网总供、回水温度5570℃(5)热网的补水量应小于热网循环量的1%(6)1蒸吨的热量可供11.5 万平方…

【1个月速成Java】基于Android平台开发个人记账app学习日记——第7天,申请阿里云SMS短信服务SDK

系列专栏链接如下&#xff0c;方便跟进&#xff1a; https://blog.csdn.net/weixin_62588253/category_12821860.html?fromshareblogcolumn&sharetypeblogcolumn&sharerId12821860&sharereferPC&sharesourceweixin_62588253&sharefromfrom_link 同时篇幅…

A02、JVM性能监测调优

1、JVM内存模型 1.1、介绍 JVM 自动内存分配管理机制的好处很多&#xff0c;但实则是把双刃剑。这个机制在提升 Java 开发效率的同时&#xff0c;也容易使 Java 开发人员过度依赖于自动化&#xff0c;弱化对内存的管理能力&#xff0c;这样系统就很容易发生 JVM 的堆内存异常&…

钉钉调试微应用整理2

第一步 新建应用 钉钉开放平台](https://open-dev.dingtalk.com/) 去新增应用 第二步 配置应用信息 把本地代码运行起来&#xff0c;并设置本地地址 第三步 在本地代码添加调试命令 这里有2中添加方式 哪一种都可以 方式一&#xff1a; index.html页面中 <!DOCTYPE h…

《TCP/IP网络编程》学习笔记 | Chapter 3:地址族与数据序列

《TCP/IP网络编程》学习笔记 | Chapter 3&#xff1a;地址族与数据序列 《TCP/IP网络编程》学习笔记 | Chapter 3&#xff1a;地址族与数据序列分配给套接字的IP地址和端口号网络地址网络地址分类和主机地址边界用于区分套接字的端口号数据传输过程示例 地址信息的表示表示IPv4…

飞牛fnOs内网穿透-使用Lucky实现ipv6动态解析+HTTPS访问NAS服务

&#x1f9ed;Lucky官方介绍 Lucky最初是作为一个小工具&#xff0c;由开发者为自己的个人使用而开发&#xff0c;用于替代socat&#xff0c;在小米路由AX6000官方系统上实现公网IPv6转内网IPv4的功能。Lucky的设计始终致力于让更多的Linux嵌入式设备运行&#xff0c;以实现或…

《安富莱嵌入式周报》第345期:开源蓝牙游戏手柄,USB3.0 HUB带电压电流测量,LCR电桥前端模拟,开源微型赛车,RF信号扫描仪,开源无线电收发器

周报汇总地址&#xff1a;嵌入式周报 - uCOS & uCGUI & emWin & embOS & TouchGFX & ThreadX - 硬汉嵌入式论坛 - Powered by Discuz! 本周更新一期视频教程 第5期&#xff1a;RTX5/FreeRTOS全家桶源码工程综合实战模板集成CANopen组件&#xff08;2024-1…

微服务中常用分布式锁原理及执行流程

1.什么是分布式锁 分布式锁是一种在分布式系统环境下实现的锁机制&#xff0c;它主要用于解决&#xff0c;多个分布式节点之间对共享资源的互斥访问问题&#xff0c;确保在分布式系统中&#xff0c;即使存在有多个不同节点上的进程或线程&#xff0c;同一时刻也只有一个节点可…

三:LoadBalancer负载均衡服务调用

LoadBalancer负载均衡服务调用 1.LB负载均衡(Load Balance)是什么2.loadbalancer本地负载均衡客户端 与 Nginx服务端负载均衡区别3.实现loadbalancer负载均衡实例3-1.首先应模拟启动多个服务提供者应用实例&#xff1a;3-2.在服务消费项目引入LoadBalancer3-3&#xff1a;测试用…

简单入门Git

Git作用 Git简介 作用&#xff1a;版本控制多人协作 集中式 典型代表&#xff1a;SVN 特点&#xff1a;所有的版本库都存在中央服务器&#xff0c;本地备份动作必须依赖中央服务器&#xff0c;如果一旦服务器挂掉&#xff0c;或者网络状况不好&#xff0c;没法提交版本。…

解决echarts桑基图为0时tooltip不显示的问题

关键代码 formatter: function (params) {console.log("params",params)if (params.value 0) {// 如果值为0&#xff0c;返回空字符串&#xff0c;不显示任何内容return params.name : params.value;// return ;} else {// 否则返回标准的格式化信息return par…

DevOps业务价值流:版本规划的最佳实践

初入公司&#xff0c;面对瀑布研发模式下的冗长周期与频繁返工&#xff0c;我率先尝试局部敏捷迭代&#xff0c;但成效有限。随后&#xff0c;推动全面敏捷化&#xff0c;从需求阶段即开始规划&#xff0c;虽方向正确&#xff0c;却遭遇版本规划难题。项目经理与产品经理对敏捷…

NewStar CTF 2024 misc WP

decompress 压缩包套娃&#xff0c;一直解到最后一层&#xff0c;将文件提取出来 提示给出了一个正则&#xff0c;按照正则爆破密码&#xff0c;一共五位&#xff0c;第四位是数字 ^([a-z]){3}\d[a-z]$ 一共就五位数&#xff0c;直接ARCHPR爆破&#xff0c;得到密码 xtr4m&…

2020年美国总统大选数据分析与模型预测

数据集取自&#xff1a;2020年&#x1f1fa;&#x1f1f8;&#x1f1fa;&#x1f1f8;美国大选数据集 - Heywhale.com 前言 对2020年美国总统大选数据的深入分析&#xff0c;提供各州和县层面的投票情况及选民行为的可视化展示。数据预处理阶段将涉及对异常值的处理&#xff0…

A Consistent Dual-MRC Framework for Emotion-cause Pair Extraction——论文阅读笔记

前言 这是我第一次向同学院同年级的学生和老师们汇报的第一篇论文,于2022年发表在TOIS上,属于CCF A类,主要内容是将MRC应用到情感原因对抽取中。 论文链接:用于情绪-原因对提取的一致双 MRC 框架 |信息系统上的 ACM Transactions 这里我就不放上我自己翻译的中文版还有我…

智慧公厕解决方案是未来厕所新建和改造的方向

在当今科技飞速发展的时代&#xff0c;智慧公厕解决方案正逐渐成为厕所新建和改造的主流方向&#xff0c;为人们带来更便捷、卫生、高效的使用体验。 一、智能化体验提升便捷性 智慧公厕配备了一系列智能设施&#xff0c;极大地提升了使用的便捷性。比如&#xff0c;智能环保取…

python爬取m3u8视频(思路到实现全讲解!!!)

文章目录 抓取m3u8视频1、思路分析2、实现分析index.m3u8 3、代码实现3.1 获取最后一个m3u8的url地址3.2 多线程下载ts文件与视频合并3.3 合并获取上面俩个代码段的代码 4、注意事项4.1 说明4.2 使用代码进行处理4.3 完整代码 5、解密处理 处理m3u8文件中的url问题 抓取m3u8视频…

“方块兽神仙猿点石成金”游戏搭建开发

“方块兽神仙猿点石成金”是一款结合了策略和运气的休闲游戏。玩家需在规定时间内向不同的山头投入矿石&#xff0c;等待神仙猿降临并随机选择一座山进行“点石成金”。根据神仙猿的选择&#xff0c;玩家将获得不同的奖励。 游戏核心机制 矿石投入&#xff1a;玩家在游戏开始…