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

【Linux】信号常见概念

文章目录

  • 信号入门
      • 生活中的信号
      • 技术应用角度的信号
        • signal函数
        • 注意事项
    • 信号的概念
    • 信号的产生
    • 信号的记录(保存)
  • 信号处理常见方式概述

信号入门

生活中的信号

  • 你在网上买了很多件商品,在等待不同商品快递的到来 但即便快递还没有到来,你也知道快递到了的时候应该怎么处理快递,也就是你能“识别快递”
  • 当快递到达目的地了,你收到了快递到来的通知,但是你不一定要马上下楼取快递,也就是说取快递的行为并不是一定要立即执行,可以理解成在“在合适的时候去取”
  • 在你收到快递到达的通知,再到你拿到快递期间,是有一个时间窗口的,在这段时间内你并没有拿到快递,但是你知道快递已经到了,本质上是你“记住了有一个快递要去取”
  • 当你时间合适,顺利拿到快递之后,就要开始处理快递了,而处理快递的方式有三种:
    • 1、执行默认动作(打开快递,使用商品)2、执行自定义动作(快递是帮别人买的,你要将快递交给他)3、忽略(拿到快递后,放在一边继续做自己的事)
  • 快递到来的整个过程,对你来讲是异步的,你不能确定你的快递什么时候到

技术应用角度的信号

例子:

#include <stdio.h>
#include <unistd.h>int main()
{while (1){printf("hello signal!\n");sleep(1);}return 0;
}
image-20220815155122089

问:为什么使用Ctrl+C后,进程就终止了呢?

实际上当用户按Ctrl+C之后,这个键盘输入会产生一个硬中断,被操作系统获取并解释成信号(Ctrl+C被解释成2号信号), 然后操作系统将2号信号发送给目标前台进程,前台进程收到2号信号后就会退出

如何验证呢?

我们可以使用signal函数对2号信号进行捕捉,证明当我们按Ctrl+C时进程确实是收到了2号信号

signal函数

#include <signal.h>
typedef void (*sighandler_t)(int); //函数指针
sighandler_t signal(int signum, sighandler_t handler)

参数解析

第一个参数:需要捕捉的信号编号 第二个参数:是对捕捉信号的处理方法,是一个函数指针,函数参数是int,返回值是void类型


作用:注册信号处理动作

修改进程对信号 signum 的默认处理动作,变为自定义的函数 handler 该函数必须满足规定的函数声明形式

注意1:就算进程注册了对9号信号的处理,也无法生效,因为9号信号是无法被捕捉的, 因为9号信号能够直接
杀死进程,捕捉9号信号是很不安全的行为


注意2:通过 signal 接口注册对某个信号的处理动作,相当于是一种预定机制, 并没有产生任何实际信号


#include <stdio.h>
#include <unistd.h>
void handle(int sig)
{printf("收到%d号信号\n",sig);
}
int main()
{signal(2,handle);//对2号信号进行捕捉(注册),并没有实际信号产生while (1){printf("hello signal!\n");sleep(1);}return 0;
}

此时当该进程收到2号信号后,就会执行我们给出的handler方法,而不会像之前一样直接退出了,因为此时我们已经将2号信号的处理方式由默认改为了自定义了

image-20220815160005743

由此也证明了, 当我们按Ctrl+C时进程确实是收到了2号信号


注意事项

1)Ctrl+C产生的信号只能发送给前台进程 , 在一个命令后面加个&就可以将其放到后台运行,这样Shell就不必等待进程结束就可以接收新的命令,启动新的进程 此时可以通过kill -9 进程PID的方式来终止这个进程!

image-20220815160207124

2)Shell能同时运行一个前台进程和任意多个后台进程,但是只有前台进程才能接到像Ctrl+C这种控制键产生的信号

3)前台进程在运行过程中,用户随时可能按下Ctrl+C而产生一个信号,也就是说该进程的用户空间代码执行到任何地方都可能收到2号信号而终止,所以信号相对于进程的控制流程来说是异步的

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


信号的概念

信号是发送给进程的,进程需要在合适的时候,执行信号对应的动作,进程必须明确各种的信号的对应的动作,和该信号是否产生无关

kill -l命令查看Linux当中的信号有哪些:

image-20220815162514919

其中:1~31号信号是普通信号,34~64号信号是实时信号 ,普通信号和实时信号各自都有31个

实际上:每个信号都有一个编号和一个宏定义名称,这些信号各自在什么条件下产生,默认的处理动作是什么,在signal(7)中都有详细说明: man 7 signal

image-20220815162814186

信号的产生

进程在运行之前就必须能够分辨出哪个信号,以及指定对该信号的处理方式,以便信号到来之时能够及时处理,换句话说:进程在信号产生之前就应该具有识别信号并处理信号的能力,例如: 在实际生活中,人们收到某种信号, 但可能并不会立即处理该信号, 因为此时还在处理其他事情

  • 比如说早上闹钟响起,我们可能要赖床,就会关掉闹钟继续睡觉,但我们知道闹钟已经响起,起床是迟早的事

注意:信号只能由操作系统发送,但信号发送的方式有多种


信号的记录(保存)

进程已经收到信号但并不能立即处理,因为当前进程正在处理优先级更高的事情,只能将信号暂存起来,并等到合适的时候再进行处理 换句话说: 进程具有暂时保存信号的能力


当一个进程接收到某种信号后,该信号是被记录在该进程的进程PCB当中的, 发送信号的本质就是向进程控制块task_struct 中写入信号数据 PCB 只有操作系统能够读写, 操作系统会向上提供多种信号的发送方式,但本质都是操作系统向进程发送信号

OS中是在结构体中用一个变量的32位比特位来记录某种信号是否产生,

例如:

image-20220815170549746

其中比特位的位置代表信号的编号,而比特位的内容就代表是否收到对应信号.比如上述的,第2个比特位是1就表明收到了2号信号


所以:一个进程收到信号,本质就是该进程内的信号位图被修改了,也就是该进程的数据被修改了, 只有操作系统才有资格修改进程的数据,因为操作系统是进程的管理者,信号的产生本质上就是操作系统直接去修改目标进程的task_struct中的信号位图


image-20220815170937569


信号处理常见方式概述

1)默认动作:执行信号的默认注册行为, 如:9号信号:SIGKILL 杀死自身进程

2)忽略动作:忽略掉该信号,不做出任何反应 这也是一种信号处理的方式

3)自定义捕捉:如:signal函数,对信号进行捕捉,执行用户注册的行为,即调用修改后的 handler 方法

  • 提供一个信号处理函数,要求内核在处理该信号时切换到用户态执行这个处理函数,这种方式称为捕捉(Catch)一个信号

其中:man 7 signal可以查看各个信号默认的处理动作

相关文章:

【Linux】信号常见概念

文章目录信号入门生活中的信号技术应用角度的信号signal函数注意事项信号的概念信号的产生信号的记录(保存)信号处理常见方式概述信号入门 生活中的信号 你在网上买了很多件商品,在等待不同商品快递的到来 但即便快递还没有到来,你也知道快递到了的时候应该怎么处理快递,也就…...

15000 字的 SQL 语句大全 第一部分

一、基础 1、说明&#xff1a;创建数据库CREATE DATABASE database-name 2、说明&#xff1a;删除数据库drop database dbname 3、说明&#xff1a;备份sql server--- 创建 备份数据的 device USE master EXEC sp_addumpdevice disk, testBack, c:\mssql7backup\MyNwind_1.dat …...

突发——字节跳动被要求出售 TikTok 股票,否则禁令,低代码也曾被打压

一、欲加之罪&#xff0c;何患无辞&#xff01; 正值人们对TikTok和其它社交媒体平台对年轻用户的影响进行更广泛、持续的反思之际&#xff0c;美政客们以数据安全为由要求TikTok出售股票&#xff0c;已然不顾文明国家的体面。 在美国&#xff0c;TikTok拥有1.4亿用户&#x…...

2023年网络安全趋势

数据安全越来越重要。 我国《数据安全法》提出“建立健全数据安全治理体系”&#xff0c;各地区部门均在探索和简历数据分类分级、重要数据识别与重点保护制度。 数据安全治理不仅是一系列技术应用或产品&#xff0c;更是包括组织构建、规范制定、技术支撑等要素共同完成数据…...

html练习

1.用户注册界面 代码&#xff1a; <!DOCTYPE html> <html><head><meta charset"utf-8"><title></title></head><body><form action"#" method"get"><table border"1" widt…...

【Redis】Redis 是如何保证高可用的?(背诵版)

Redis 是如何保证高可用的&#xff1f;1. 说一下 Redis 是如何保证高可用的&#xff1f;2. 了解过主从复制么&#xff1f;2.1 Redis 主从复制主要的作用是什么?2.2 Redis 主从模式的拓扑结构&#xff1f;&#xff08;1&#xff09;一主一从结构&#xff08;2&#xff09;一主多…...

Qt---去掉标题栏后,最大化应用程序窗口时,窗口遮住了任务栏

// showMaximized(); // Qt最大化显示函数 任务栏都会覆盖static bool max false;static QRect location this->geometry();if (max) {this->setGeometry(location);//回复窗口原大小和位置// ui->maxBtn->setIcon(QIcon(":/MAX_.png"));}else {// ui-…...

Cadence Allegro 导出Netin(non-back)报告详解

⏪《上一篇》   🏡《上级目录》   ⏩《下一篇》 目录 1,概述2,Netin(non-back)作用3,Netin(non-back)示例4,Netin(non-back)导出方法4.1,方法1:4.2,方法2:B站关注“硬小二”浏览更多演示视频...

HTML语言

1.什么是HTML&#xff1f; 1、HTML是超文本标记语言&#xff08;Hyper Text Markup Language&#xff09; 2、HTML由各种各样的标签(tag)组成&#xff0c;如、 3、HTML文档 网页   (1)一种纯文本文件&#xff0c;扩展名为.html或.html&#xff1b;   (2)最终显示结果取决…...

线性代数之行列式

一、思维导图二、二阶、三阶行列式的定义1、二阶行列式2、三阶行列式沙路法展开3、解方程3.1解二元一次方程组观察上面两个未知量的值不难发现&#xff0c;它 们的分母均是上述方程组未知量的系数形成的二阶行列式&#xff0c;&#x1d465;1的分子是将系数行列 式的第一列换成…...

【FPGA-Spirit_V2】小精灵V2开发板初使用

&#x1f389;欢迎来到FPGA专栏~小精灵V2开发板初使用 ☆* o(≧▽≦)o *☆嗨~我是小夏与酒&#x1f379; ✨博客主页&#xff1a;小夏与酒的博客 &#x1f388;该系列文章专栏&#xff1a;FPGA学习之旅 文章作者技术和水平有限&#xff0c;如果文中出现错误&#xff0c;希望大家…...

STL与其空间配置器

目录什么是STLSTL的六大组件STL的缺陷什么是空间配置器为什么需要空间配置器GI-STL空间配置器实现原理一级空间配置器二级空间配置器内存池SGI-STL中二级空间配置器设计SGI-STL二级空间配置器之空间申请前期的准备申请空间填充内存块向内存池中索要空间SGI-STL二级空间配置器之…...

leetcode刷题之回文链表

目录 做题思路 代码实现 1.找到链表的中间节点 2.反转中间节点之后的链表 3.判断倒置的后半部分的链表是否等于前半部分的链表 整体代码展示 总结&#xff1a; 这里是题目链接。 这道题目的意思是&#xff1a;判断该链表中后半部分倒置是否跟前半部分相同&#xff0c;如…...

复制带随机指针的链表最长连续递增序列数组的度写字符串需要的行数最短补全词

复制带随机指针的链表来源&#xff1a;杭哥138. 复制带随机指针的链表 - 力扣&#xff08;LeetCode&#xff09;typedef struct Node Node; Node* BuyNode(int x) {Node* newnode (Node*)malloc(sizeof(Node));newnode->valx;newnode->nextNULL;newnode->randomNULL;…...

「ML 实践篇」回归系统:房价中位数预测

文章目录1. 项目分析1. 框架问题2. 性能指标2. 获取数据1. 准备工作区2. 下载数据3. 查看数据4. 创建测试集3. 数据探索1. 地理位置可视化2. 寻找相关性3. 组合属性4. 数据准备1. 数据清理2. Scikit-Learn 的设计3. 处理文本、分类属性4. 自定义转换器5. 特征缩放6. 流水线5. 选…...

深度学习 Day27——利用Pytorch实现运动鞋识别

深度学习 Day27——利用Pytorch实现运动鞋识别 文章目录深度学习 Day27——利用Pytorch实现运动鞋识别一、查看colab机器配置二、前期准备1、导入依赖项并设置GPU2、导入数据三、构建CNN网络四、训练模型1、编写训练函数2、编写测试函数3、设置动态学习率4、正式训练五、结果可…...

Springboot 整合dom4j 解析xml 字符串 转JSONObject

前言 本文只介绍使用 dom4j 以及fastjson的 方式&#xff0c; 因为平日使用比较多。老的那个json也能转&#xff0c;而且还封装好了XML&#xff0c;但是本文不做介绍。 正文 ①加入 pom 依赖 <dependency><groupId>dom4j</groupId><artifactId>dom4j…...

网络安全实验——安全通信软件safechat的设计

网络安全实验——安全通信软件safechat的设计 仅供参考&#xff0c;请勿直接抄袭&#xff0c;抄袭者后果自负。 仓库地址&#xff1a; 后端地址&#xff1a;https://github.com/yijunquan-afk/safechat-server 前端地址&#xff1a; https://github.com/yijunquan-afk/safec…...

【MySQL】MySQL的事务

目录 概念 什么是事务? 理解事务 事务操作 事务的特性 事务的隔离级别 事务的隔离级别-操作 概念 数据库存储引擎是数据库底层软件组织&#xff0c;数据库管理系统&#xff08;DBMS&#xff09;使用数据引擎进行创建、查 询、更新和删除数据。 不同的存储引擎提供…...

Java分布式事务(七)

文章目录&#x1f525;Seata提供XA模式实现分布式事务_业务说明&#x1f525;Seata提供XA模式实现分布式事务_下载启动Seata服务&#x1f525;Seata提供XA模式实现分布式事务_转账功能实现上&#x1f525;Seata提供XA模式实现分布式事务_转账功能实现下&#x1f525;Seata提供X…...

GTE中文向量模型实战教程:基于test_uninlu.py扩展支持中文繁体与简体兼容测试

GTE中文向量模型实战教程&#xff1a;基于test_uninlu.py扩展支持中文繁体与简体兼容测试 1. 引言&#xff1a;当GTE模型遇上中文繁简转换 如果你正在使用GTE中文向量模型处理文本&#xff0c;可能会遇到一个不大不小的麻烦&#xff1a;用户输入的文本&#xff0c;有时是简体中…...

Mem Reduct:3步解决电脑运行缓慢的实用内存管理指南

Mem Reduct&#xff1a;3步解决电脑运行缓慢的实用内存管理指南 【免费下载链接】memreduct Lightweight real-time memory management application to monitor and clean system memory on your computer. 项目地址: https://gitcode.com/gh_mirrors/me/memreduct 你是…...

从《糖豆人》到《Among Us》:拆解Unity NetCode中NetworkTransform如何塑造不同的联机手感

从《糖豆人》到《Among Us》&#xff1a;NetworkTransform如何定义联机游戏的灵魂手感 当你在《糖豆人》的旋转平台上与对手挤作一团时&#xff0c;那种略带延迟的物理碰撞反馈&#xff1b;或是《Among Us》中看着队友角色突然"瞬移"到另一个房间的诡异同步——这些…...

res-downloader:高效捕获与多平台适配的网络资源下载解决方案

res-downloader&#xff1a;高效捕获与多平台适配的网络资源下载解决方案 【免费下载链接】res-downloader 视频号、小程序、抖音、快手、小红书、直播流、m3u8、酷狗、QQ音乐等常见网络资源下载! 项目地址: https://gitcode.com/GitHub_Trending/re/res-downloader 在数…...

FXGL:JavaFX游戏开发的现代化架构实践

FXGL&#xff1a;JavaFX游戏开发的现代化架构实践 【免费下载链接】FXGL Java / JavaFX / Kotlin Game Library (Engine) 项目地址: https://gitcode.com/gh_mirrors/fx/FXGL FXGL是一个基于JavaFX构建的现代化游戏开发框架&#xff0c;为Java开发者提供了完整的游戏开发…...

揭秘银行核心系统C++内存池崩溃真相:基于真实生产环境的17GB/日内存碎片数据复盘

第一章&#xff1a;银行核心系统C内存池崩溃事件全景概览某大型商业银行在一次日终批量交易高峰期&#xff0c;核心账务系统突发大规模服务中断&#xff0c;平均响应延迟飙升至12秒以上&#xff0c;部分交易返回“内存分配失败”错误码。事后根因分析确认&#xff1a;问题源于自…...

你的代码为什么跑不满GPU?从Cache命中率和指令集角度拆解Roofline下的性能损失

你的代码为什么跑不满GPU&#xff1f;从Cache命中率和指令集角度拆解Roofline下的性能损失 当你在AI训练或高性能计算任务中发现程序性能远低于GPU的理论峰值时&#xff0c;Roofline模型往往能直观揭示问题所在——但真正的挑战在于&#xff0c;如何从那些落在屋顶线之下的数据…...

Cursor AI破解免费VIP 2025终极完整教程:轻松解除试用限制,畅享专业功能

Cursor AI破解免费VIP 2025终极完整教程&#xff1a;轻松解除试用限制&#xff0c;畅享专业功能 【免费下载链接】cursor-free-vip [Support 0.45]&#xff08;Multi Language 多语言&#xff09;自动注册 Cursor Ai &#xff0c;自动重置机器ID &#xff0c; 免费升级使用Pro …...

C盘清理与优化:为伏羲模型本地开发释放存储空间

C盘清理与优化&#xff1a;为伏羲模型本地开发释放存储空间 每次打开资源管理器&#xff0c;看到C盘那刺眼的红色警告条&#xff0c;是不是感觉心都跟着揪了一下&#xff1f;特别是当你正在本地跑一个像伏羲这样的大模型&#xff0c;或者处理大型数据集时&#xff0c;几十个G的…...

基于R语言的自动数据收集:网络抓取和文本挖掘实用指南【1.4】

2.3.11 表格标签<table>、<tr>、<td>和<th>下一组元素让HTML能够显示表格。查看一下表2-2&#xff0c;并把它和如下所示的HTML对应表示进行比较。我们用<table>标签来产生一个表格。我们用<tr>产生一个新行。在<tr>内部&#xff0c;…...