Linux进程信号(一)之信号的入门
文章目录
- 信号入门
- 1. 生活角度的信号
- 2. 技术应用角度的信号
- 3. 注意
- 4. 信号概念
- 5.用kill -l命令可以察看系统定义的信号列表
- 6. 信号处理常见方式
信号入门
1. 生活角度的信号
你在网上买了很多件商品,再等待不同商品快递的到来。但即便快递没有到来,你也知道快递来临时,
你该怎么处理快递。也就是你能“识别快递”
当快递员到了你楼下,你也收到快递到来的通知,但是你正在打游戏,需5min之后才能去取快递。
那么在这5min之内,你并没有下去去取快递,但是你是知道有快递到来了。
也就是取快递的行为并不是一定要立即执行,可以理解成“在合适的时候去取”。
在收到通知,再到你拿到快递期间,是有一个时间窗口的,
在这段时间,你并没有拿到快递,但是你知道有一个快递已经来了。
本质上是你“记住了有一个快递要去取”。
当你时间合适,顺利拿到快递之后,就要开始处理快递了。
而处理快递一般方式有三种:
- 执行默认动作(幸福的打开快递,使用商品)
- 执行自定义动作(快递是零食,你要送给你你的女朋友)
- 忽略快递(快递拿上来之后,扔掉床头,继续开一把游戏)
快递到来的整个过程,对你来讲是异步的,你不能准确断定快递员什么时候给你打电话。
进程就是你,操作系统就是快递员,信号就是快递。
信号举例:信号弹、上下课铃声、红绿灯、快递发短信取件码、狼烟、发令枪、闹钟等……
问题:
a.你(进程)怎么认识这些信号的?有人教 - > 我记住了
认识:1.识别信号 2.(进程)知道信号产生后的处理方法
b.即便是现在没有信号产生,但我也知道信号产生之后,我该干什么
c.信号产生了,我们可能并不会立即处理这个信号,
在合适的时候再处理,因为我们可能在处理更重要的事情。
– 所以信号产生 ---------时间窗口---------> 信号处理
在这个时间窗口内,必须记住信号的到来!
结论:
-
进程 必须 能够识别+处理信号 – 信号没有产生,也要具备处理信号的能力。
– 信号的处理能力,属于进程内置功能的一部分!
-
进程即便是没有收到信号,也能知道哪些信号该怎么处理。
-
当进程真的收到了一个具体的信号的时候,进程可能并不会立即处理这个信号,
因为进程可能在运行更重要的代码(优先级更高),进程会在合适的时候处理这个信号。
-
一个进程当信号产生到信号开始被处理,中间一定会有时间窗口,
所以进程具有临时保存 哪些信号已经发生了的 能力。
2. 技术应用角度的信号
makefile
myprocess:mysignal.ccg++ -o $@ $^ -std=c++11
.PHONY:clean
clean:rm -rf myprocess
mysignal.cc
#include<iostream>
#include<unistd.h>
#include<signal.h>using namespace std;int main()
{while(1){cout<<"I am a crazy process,pid: "<<getpid()<<endl;sleep(1);}return 0;
}
运行结果:
前台进程:
后台进程:
ctrl + c
是输入给前台进程(bash
),所以myprocess
不会终止。
bash
进程收到了ctrl + c
为什么不退出,因为bash
对这个信号做了特定的处理。
Linux中,一次登录,一个终端,一般会配上一个bash
,每一个登录,
只允许一个进程是前台进程,可以允许多个进程是后台进程!
bash
是一个前台进程,允许bash
接受用户指令,
但是当你的代码(./myprocess
)跑起来了,你的进程就变成了前台进程,
bash
就变成了后台进程,所以你输入ls
、pwd
输给了myprocess
,
myprocess
不会对你输出的字符串做处理,所以就没用了。
前台进程、后台进程的本质区别:谁来获取键盘输入(就是前台)。
看似信息干扰了,但是实际上并没有干扰。
在键盘输入不会被干扰,回现到显示器上是乱的而已。(输出上互相干扰)
显示器文件、键盘文件都有独立的缓冲区,所以输入不会乱。
输出为什么会乱呢?
因为多进程访问显示器资源,显示器文件就叫共享资源(没有保护机制),所以就会乱。
ctrl + c
为什么可以杀掉前台进程?
键盘输入首先是被前台进程收到的!
ctrl + c
本质是被进程解释为收到了2号信号。
进程收到2号信号的默认动作就是终止自己这个进程。
验证:
signal
函数就是修改特定进程对信号的处理动作的!
mysignal.cc
#include<iostream>
#include<unistd.h>
#include<signal.h>using namespace std;//int signum: 收到了哪个信号
void Handler(int signum)
{cout<<"process get a signal: "<<signum<<endl;
}int main()
{signal(SIGINT,Handler);//只需要设置一次,在进程生命周期内都有效。while(1){cout<<"I am a crazy process,pid: "<<getpid()<<endl;sleep(1);}return 0;
}
- 这个进程不退出了,默认处理动作是退出,我们已经捕捉了这个信号,
所以不再执行默认动作,转而执行自定义动作。(三个动作,三选一)
signal
函数调用Handler
方法是在收到信号的时候触发的!而不是调用signal函数时触发的。
如果后续没有收到这个信号,那么Handler
方法将永远不会被调用。
-
我们可以把所有的信号的处理方法都设置成同一个,
Handler
要知道是因为收到哪个信号而调用这个方法的。
键盘数据是如何输入给内核的,ctrl+c又是如何变成信号的–谈谈硬件
用户按下Ctrl-C ,这个键盘输入产生一个硬件中断,被OS获取,解释成信号,发送给目标前台进程。
前台进程因为收到信号,进而引起进程退出。
3. 注意
-
Ctrl-C 产生的信号只能发给前台进程。一个命令后面加个&可以放到后台运行,
这样Shell不必等待进程结束就可以接受新的命令,启动新的进程。
-
Shell可以同时运行一个前台进程和任意多个后台进程,
只有前台进程才能接到像 Ctrl-C 这种控制键产生的信号。
-
前台进程在运行过程中用户随时可能按下 Ctrl-C 而产生一个信号,
也就是说该进程的用户空间代码执行到任何地方都有可能收到 SIGINT 信号而终止
所以信号相对于进程的控制流程来说是异步(Asynchronous)的。
4. 信号概念
信号是进程之间事件异步通知的一种方式,属于软中断。
5.用kill -l命令可以察看系统定义的信号列表
一共62种,1-32号是普通信号,34-64是实时信号。
普通信号:信号产生了可以不立即处理。
实时信号:一旦产生必须立即(尽快)处理。
-
每个信号都有一个编号和一个宏定义名称,这些宏定义可以在
signal.h
中找到,例如其中有定 义
#define SIGINT 2
-
编号34以上的是实时信号,暂不讨论实时信号。
普通信号:进程收到了n次普通信号,但是来不及处理信号,所以最后只会当作一次信号来处理。
实时信号:
a. 实时信号一到来,那么进程必须立即处理!
b. 进程收到10次实时信号,就要执行10次实时信号。(不能丢失)
管理实时信号使用队列。
-
这些信号各自在什么条件下产生,默认的处理动作是什么
在signal(7)中都有详细说明: man 7 signal
6. 信号处理常见方式
(sigaction
函数),可选的处理动作有以下三种:
- 忽略此信号。(忽略)
- 执行该信号的默认处理动作。(默认动作)
- 提供一个信号处理函数。(自定义动作)
要求内核在处理该信号时切换到用户态执行这个处理函数(自定义动作),
这种方式称为捕捉(Catch
)一个信号。
相关文章:

Linux进程信号(一)之信号的入门
文章目录 信号入门1. 生活角度的信号2. 技术应用角度的信号3. 注意4. 信号概念5.用kill -l命令可以察看系统定义的信号列表6. 信号处理常见方式 信号入门 1. 生活角度的信号 你在网上买了很多件商品,再等待不同商品快递的到来。但即便快递没有到来,你也…...

基于springboot+vue的机场乘客服务系统
开发语言:Java框架:springbootJDK版本:JDK1.8服务器:tomcat7数据库:mysql 5.7数据库工具:Navicat12开发软件:eclipse/myeclipse/ideaMaven包:Maven3.3.9 系统展示 用户管理 航班信…...

基于SpringBoot的房屋租赁管理系统
作者:计算机学姐 开发技术:SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等,“文末源码”。 专栏推荐:前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码、微信小程序源码 精品专栏:…...
redis数据结构-11(了解 Redis 持久性选项:RDB 和 AOF)
了解 Redis 持久性选项:RDB 和 AOF Redis 提供了多个持久性选项,以确保数据持久性并防止在服务器发生故障或重启时丢失数据。了解这些选项对于为您的特定使用案例选择正确的策略、平衡性能和数据安全至关重要。本章节将深入探讨 Redis 中的两种主要持久…...

STM32外设AD/DA-基础及CubeMX配置
STM32外设AD/DA-基础及CubeMX配置 一,什么是AD/DA二,基础概念1,模拟 vs 数字2,AD转换1,分辨率 (Resolution)2,参考电压 (Reference Voltage, Vref)3,采样率 (Sampling Rate) 3,DA转换…...

React Native简介
React Native 是由 Meta(原 Facebook)开源的跨平台移动应用开发框架,基于 React 和 JavaScript,允许开发者使用同一套代码库构建 iOS 和 Android 原生应用。通过 JavaScript 调用原生组件实现高性能渲染。 跨平台开发 共享 80%-9…...
微服务如何实现服务的高并发
高并发的常见指标 响应时间吞吐量每秒查询率QPS并发用户数 高并发是分布式系统架构设计必须的考虑因素 具体实现方案粗略分两种: 垂直扩展 硬件升级方向 处理器:增加CPU核数(如升级至32核以上)或采用更高主频的CPU存储设备…...

GCC 使用说明
参数 -fPIC ppc_85xx-gcc -shared -fPIC liberr.c -o liberr.so -fPIC 作用于编译阶段,告诉编译器产生与位置无关代码(Position-Independent Code), 则产生的代码中,没有绝对地址,全部使用相对地址,故而代码可以被加…...
码蹄集——圆包含
MT1181 圆包含 输入2个圆的圆心的坐标值(x,y)和半径,判断断一个圆是否完全包含另一个圆,输出YES或者NO。另:内切不算做完全包含。 格式 输入格式:输入整型,空格分隔。 每行输入一组…...
CSR、SSR与ISR的奇妙之旅
网页渲染三剑客:CSR、SSR与ISR的奇妙之旅 三种渲染方式的核心本质 CSR(客户端渲染)让浏览器成为"厨师",SSR(服务器端渲染)让服务器担任"厨师",而ISR(增量静态再生)则是一位兼具"提前备餐"和"即时烹饪"能力的"超级厨师"…...

Verilog HDL 语言整理
Verilog HDL 语言 Verilog HDL 简介 硬件描述语言Hardware Description Language是一种用形式化方法即文本形式 来描述和设计数字电路和数字系统的高级模块化语言 Verilog HDL(Hardware Description Language)是一种硬件描述语言,用于建模…...

车道线检测----Lane-ATT
本文针对车道线检测----Lane-ATT论文所有细节进行阐述,有帮助的话点个收藏关注吧 保持对车道的关注:注意力引导的车道检测 摘要 但许多方法在保持实时效率方面存在问题,这对于自动驾驶车辆至关重要。在本文中,我们提出了LaneATT…...

linux安装宝塔面板到数据盘
操作很简单,假如数据盘挂载在cipan1,在数据盘新建目录www,为了方便对应。 执行一下命令,创建软连接 ln -s /cipan1/www www 此时,根目录就出现了www文件夹 下面正常安装宝塔即可...

【基础】Windows开发设置入门7:PowerShell的相关概念和使用
前言 大家熟悉的docker、Python,但对于Windows上有一套开配合开发的相对底层的环境设置,包括powershell、winget、WSL、还有开发驱动器什么的,我准备系统学一下,不然地基不牢,也盖不起冲天高楼~ 本节,介绍…...
【python基础知识】Day 27 函数专题2:装饰器
知识点: 装饰器的思想:进一步复用函数的装饰器写法注意内部函数的返回值 装饰器教程 作业: 编写一个装饰器 logger,在函数执行前后打印日志信息(如函数名、参数、返回值) def logger(func):def wrapper(*ar…...

芯片生态链深度解析(一):基础材料篇——从砂砾到硅基王国的核心技术突围
【开篇:芯片——现代文明的“炼金术”】 当您滑动手机屏幕、驾驶新能源汽车、甚至用AI生成一幅画时,是否想过这些科技奇迹都始于一粒沙子?芯片,这个边长不足2厘米的黑色薄片,正是通过将砂砾提纯为高纯度硅锭ÿ…...

一款利用ADB (安卓调试桥)来控制手机的玩机工具
—————【下 载 地 址】——————— 【本章下载一】:https://drive.uc.cn/s/f36ed8ff62f74 【本章下载二】:https://pan.xunlei.com/s/VOQDmKCq4u-CygjX9Tcn3fxEA1?pwdwf3t# 【百款黑科技】:https://ucnygalh6wle.feishu.cn/wiki/…...

使用mermaid 语言绘画时序图和链路图
给大家展示一下效果, 官方地址:https://mermaid.nodejs.cn/ 官方开发地:https://mermaid.nodejs.cn/intro/#google_vignette graph LR%% 样式定义(完全保留) classDef user fill:#E1F5FE,stroke:#0288D1;classDef …...

浅论3DGS溅射模型在VR眼镜上的应用
摆烂仙君小课堂开课了,本期将介绍如何手搓VR眼镜,并将随手拍的电影变成3D视频。 一、3DGS模型介绍 3D 高斯模型是基于高斯函数构建的用于描述三维空间中数据分布概率的模型,高斯函数在数学和物理领域有着广泛应用,其在 3D 情境下…...

6种方式来探究数据集的的方法worldquant
覆盖率百分比 指金融数据字段(如股价、成交量、财务指标)在时间或空间上的有效数据比例。 时间维度:数据在历史周期内的完整度(如:某股票过去 1 年中,95% 的交易日有收盘价)。空间维度…...

深度学习中的归一化:提升模型性能的关键因素
📌 友情提示: 本文内容由银河易创AI(https://ai.eaigx.com)创作平台的gpt-4-turbo模型辅助完成,旨在提供技术参考与灵感启发。文中观点或代码示例需结合实际情况验证,建议读者通过官方文档或实践进一步确认…...

vue+threeJS 大理石贴图
嗨,我是小路。今天主要和大家分享的主题是“vuethreeJS 大理石贴图”。 通过 Vue 3 和 Three.js 实现大理石纹理效果,并将这种技术应用于产品展示、虚拟展览、甚至是互动游戏之中,其潜力无穷。今天主要介绍基础的大理石贴图。 vueth…...

WebGL 3着色器和GLSL
我们之前提到过着色器和GLSL,但是没有涉及细节,你可能已经对此有所了解, 但以防万一,这里将详细讲解着色器和GLSL。 在工作原理中我们提到,WebGL每次绘制需要两个着色器, 一个顶点着色器和一个片段着色器&…...
vscode debug node + 前端
方法 2:调试全栈(Node 前端) 如果需同时调试后端和前端: 分别启动两个调试会话 一个配置调试 Node.js 后端(server.js)。 另一个配置调试浏览器前端(如上)。 {// Use IntelliS…...
Python训练营打卡 Day27
函数专题2:装饰器 知识点回顾: 装饰器的思想:进一步复用函数的装饰器写法注意内部函数的返回值 昨天我们接触到了函数大部分的功能,然后在你日常ctrl点进某个复杂的项目,发现函数上方有一个xxx,它就是装饰器 装饰器本质…...

华为OD机试真题——通信系统策略调度(用户调度问题)(2025B卷:100分)Java/python/JavaScript/C/C++/GO最佳实现
2025 B卷 100分 题型 本专栏内全部题目均提供Java、python、JavaScript、C、C++、GO六种语言的最佳实现方式; 并且每种语言均涵盖详细的问题分析、解题思路、代码实现、代码详解、3个测试用例以及综合分析; 本文收录于专栏:《2025华为OD真题目录+全流程解析+备考攻略+经验分…...
SQL实战:06交叉日期打折问题求解
文章目录 概述题目:交叉打折问题求解题解第一步:使用滑动窗口统计当前活动前的最大结束日期步骤二:拆分出交叉部分步骤三:计算每次活动的持续天数步骤四:分组统计最终结果完整SQL 概述 最近刷题时遇到一些比较有意思的…...
升级kafka4.0.0,无ZK版本
设备规划: 172.20.192.47 kafka-0 172.20.192.48 kafka-1 172.20.192.49 kafka-2 单机块7TB Nvme磁盘一共9块 # 格式化成GPT分区 sudo parted /dev/nvme0n1 --script mklabel gpt sudo parted /dev/nvme1n1 --script mklabel gpt sudo parted /dev/nvme2n1 --s…...

llamafactory SFT 从断点恢复训练
背景 我使用llamafactory sft 微调模型的时候。gpu停止运行了。日志文件没有任何的报错信息。 显存还是占用状态。 查看llamafactory的进程是下述信息: 151312 151306 91 17:42 ? 03:58:10 [llamafactory-cl] 既然如此,那就只能从断点恢复训练了。 …...
PCL 计算一条射线与二次曲面的交点
文章目录 一、简介二、实现代码三、实现效果一、简介 对于二次曲面而言,其一般方程可以写为: z = a 0 + a 1 x + a 2 y + a...