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

Linux信号详解

文章目录

  • Linux信号
    • 什么是信号
      • **从生活角度理解: **
      • 技术应用角度的信号
      • 进程的注意事项
      • 信号概念
      • 用kill -l命令可以察看系统定义的信号列表
      • 信号处理常见方式概览
  • 信号产生
      • 通过终端按键产生信号
    • 使用signal函数自定义SIGINT信号的处理方式
    • 使用sigprocmask函数阻塞2号信号和40号信号
      • volatile关键字

Linux信号

什么是信号

**从生活角度理解: **

  • 你在网上买了很多件商品,再等待不同商品快递的到来。但即便快递没有到来,你也知道快递来临时,你该怎么处理快递。也就是你能“识别快递”。
  • 当快递员到了你楼下,你也收到快递到来的通知,但是你正在打游戏,需5min之后才能去取快递。那么在在这5min之内,你并没有下去去取快递,但是你是知道有快递到来了。也就是取快递的行为并不是一定要立即执行,可以理解成“在合适的时候去取"。
  • 在收到通知,再到你拿到快递期间,是有一个时间窗口的,在这段时间,你并没有拿到快递,但是你知道有一个快递已经来了。本质上是你“记住了有一个快递要去取"。
  • 当你时间合适,顺利拿到快递之后,就要开始处理快递了。而处理快递一般方式有三种:1. 执行默认动作(幸福的打开快递,使用商品)2. 执行自定义动作(快递是零食,你要送给你你的女朋友)3. 忽略快递(快递拿上来之后,扔掉床头,继续开一把游戏)。
  • 快递到来的整个过程,对你来讲是异步的,你不能准确断定快递员什么时候给你打电话。

技术应用角度的信号

用户输入命令,在Shell下启动一个前台进程:

用户按下Ctrl+C ,这个键盘输入产生一个硬件中断,被OS获取,解释成信号,发送给目标前台进程。

#include<iostream>
#include<unistd.h>
using namespace std;
int main(int argc,char*argv[])
{while (true){cout<<"我是一个进程我的pid: "<<getpid()<<endl;sleep(2);}}
  • 前台进程因为收到信号,进而引起进程退出。

在这里插入图片描述

  • 请将生活例子和 Ctrl-C 信号处理过程相结合,解释一下信号处理过程。
    假设你的快递到了,快递员就像操作系统一样给进程发信号,快递员则打电话给你说你快递到了,然后我自己说等下下去取。就像使用键盘敲出ctrl+c一样给操作系统,然后操作系统发送信号给进程,进程然后终止。
  • 进程就是你,操作系统就是快递员,信号就是快递。

进程的注意事项

一个bash当中,终端终只能有一个前台进程
在这里插入图片描述

Ctrl-C 产生的信号只能发给前台进程。一个命令后面加个&可以放到后台运行,这样Shell不必等待进程结束就可以接受新的命令,启动新的进程。

在这里插入图片描述

后台进程可以被 kill -9 杀死

在这里插入图片描述

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

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

在这里插入图片描述

在这里插入图片描述

信号概念

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

在这里插入图片描述

用kill -l命令可以察看系统定义的信号列表

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RnYA0gmG-1678453202752)(C:\Users\蒋乙赏\AppData\Roaming\Typora\typora-user-images\image-20230310194923194.png)]

总共有62个信号1-31个信号是普通信号,34-64是实时信号。

  • 每个信号都有一个编号和一个宏定义名称,这些宏定义可以在signal.h中找到,例如其中有定 义 #defineSIGINT 2。
  • 编号34以上的是实时信号,本章只讨论编号34以下的信号,不讨论实时信号。这些信号各自在什么条件下产生,默认的处理动作是什么,在signal(7)中都有详细说明: man 7 signal。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RSmi6w0I-1678453202753)(C:\Users\蒋乙赏\AppData\Roaming\Typora\typora-user-images\image-20230310195140882.png)]

信号处理常见方式概览

(sigaction函数稍后详细介绍),可选的处理动作有以下三种:

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

信号产生

在这里插入图片描述

通过终端按键产生信号

在这里插入图片描述

SIGINT的默认处理动作是终止进程,SIGQUIT的默认处理动作是终止进程并且Core Dump,现在我们来验证一下。

Core Dump

首先解释什么是Core Dump。当一个进程要异常终止时,可以选择把进程的用户空间内存数据全部 保存到磁盘上,文件名通常是core,这叫做Core Dump。进程异常终止通常是因为有Bug,比如非法内存访问导致段错误,事后可以用调试器检查core文件以查清错误原因,这叫做Post-mortem Debug(事后调试)。一个进程允许产生多大的core文件取决于进程的Resource Limit(这个信息保存 在PCB中)。默认是不允许产生core文件的,因为core文件中可能包含用户密码等敏感信息,不安全。在开发调试阶段可以用ulimit命令改变这个限制,允许产生core文件。

首先用ulimit命令改变Shell进程的Resource Limit,允许core文件最大为1024K: ulimit -c 1024

使用 kill -3命令

在这里插入图片描述

ulimit命令改变了Shell进程的Resource Limit,test进程的PCB由Shell进程复制而来,所以也具 有和Shell进程相同的Resource Limit值,这样就可以产生Core Dump了。 使用core文件:

在这里插入图片描述

=
在这里插入图片描述

我们在C/C++当中除零,内存越界等异常,在系统层面上,是被当成信号处理的。

总结思考一下:

  • 上面所说的所有信号产生,最终都要有OS来进行执行,为什么?OS是进程的管理者。
  • 信号的处理是否是立即处理的?在合适的时候。
  • 信号如果不是被立即处理,那么信号是否需要暂时被进程记录下来?记录在哪里最合适呢?

img

  • 个进程在没有收到信号的时候,能否能知道,自己应该对合法信号作何处理呢?
  • 如何理解OS向进程发送信号?能否描述一下完整的发送处理过程? 位图保存了1-31的信号。

在这里插入图片描述

在这里插入图片描述

使用signal函数自定义SIGINT信号的处理方式

#include<iostream>
#include<unistd.h>
#include<sys/types.h>
#include<signal.h>
#include<sys/wait.h>using namespace std;void sigcb(int signo)
{cout<<"我是一个2号信号:,你成功处理了我 "<<signo<<endl;
}
int main(int argc,char*argv[])
{signal(2,sigcb);while(true){cout<<"我的pid:"<<getpid()<<"\n";sleep(2);}return 0;
}

img

使用sigprocmask函数阻塞2号信号和40号信号

#include<iostream>
#include<unistd.h>
#include<stdlib.h>
#include<sys/types.h>
#include<signal.h>
#include<sys/wait.h>using namespace std;void Showpending(sigset_t* set)
{for(int i=1;i<41;i++){if(sigismember(set,i)){cout<<"1";}else{cout<<"0";}}cout<<endl;
}
int main(int argc,char*argv[])
{sigset_t set,oset;sigemptyset(&set);sigaddset(&set,2);sigaddset(&set,40);sigprocmask(SIG_SETMASK,&set,&oset);while (true){/* code */Showpending(&set);sleep(5);}return 0;
}

img

img

volatile关键字

意义:禁止编译器对该语句做出优化。就比如定义一个全局变量,此时如果优化的话,则这个值会被存到寄存器中,此时你如果对该全局变量进行修改的话,只是对内存中的数据进行修改,寄存器的值是不变的。定义该关键字意义是告诉编译器,想获取我这个值必须要去内存中去取。 禁止将我这个值优化到寄存器中。

在这里插入图片描述
在这里插入图片描述

相关文章:

Linux信号详解

文章目录Linux信号什么是信号**从生活角度理解: **技术应用角度的信号进程的注意事项信号概念用kill -l命令可以察看系统定义的信号列表信号处理常见方式概览信号产生通过终端按键产生信号使用signal函数自定义SIGINT信号的处理方式使用sigprocmask函数阻塞2号信号和40号信号vo…...

JAVA使用POI操作EXCEL

设置公式totalRow.createCell(4).setCellFormula("SUM(E9:E35");// 执行公式wb.setForceFormulaRecalculation(true);合并单元格sheet.addMergedRegion(new CellRangeAddress(0, 0, 3, 7));单元格格式CellStyle cellStyle wb.createCellStyle();// 字体XSSFFont fon…...

只做笔记有必要买apple pencil吗?苹果笔的代替笔推荐

如果仅仅使用IPAD来进行打游戏和看剧的话&#xff0c;未免有些浪费。ipad的作用还是挺大的&#xff0c;可以用来做学习笔记&#xff0c;也可以用来做绘画&#xff0c;也可以用来做一些重要的内容。很多人都会认为&#xff0c;苹果的电容笔很好用&#xff0c;但是价格上要比一般…...

Hive---sqoop安装教程及sqoop操作

sqoop安装教程及sqoop操作 文章目录sqoop安装教程及sqoop操作上传安装包解压并更名添加jar包修改配置文件添加sqoop环境变量启动sqoop操作查看指定mysql服务器数据库中的表在hive中创建一个teacher表跟mysql的mysql50库中的teacher结构相同将mysql中mysql50库中的sc数据导出到h…...

【C++】register 关键字

文章目录一. 什么是寄存器&#xff1f;二. 为什么要存在寄存器&#xff1f;三. register 修饰变量一. 什么是寄存器&#xff1f; 我们都知道&#xff0c;CPU主要是负责进行计算的硬件单&#xff0c;但是为了方便运算&#xff0c;一般第一步需要先把数据从内存读取到CPU内&…...

剑指 Offer II 024. 反转链表

题目链接 剑指 Offer II 024. 反转链表 easy 题目描述 给定单链表的头节点 head&#xff0c;请反转链表&#xff0c;并返回反转后的链表的头节点。 示例 1&#xff1a; 输入&#xff1a;head [1,2,3,4,5] 输出&#xff1a;[5,4,3,2,1] 示例 2&#xff1a; 输入&#xff1a;h…...

从Linux内核中学习高级C语言宏技巧

Linux内核可谓是集C语言大成者&#xff0c;从中我们可以学到非常多的技巧&#xff0c;本文来学习一下宏技巧&#xff0c;文章有点长&#xff0c;但耐心看完后C语言level直接飙升。 本文出自&#xff1a;大叔的嵌入式小站&#xff0c;一个简单的嵌入式/单片机学习、交流小站 从…...

详解Python的装饰器

Python中的装饰器是你进入Python大门的一道坎&#xff0c;不管你跨不跨过去它都在那里。 为什么需要装饰器 我们假设你的程序实现了say_hello()和say_goodbye()两个函数。 def say_hello():print "hello!"def say_goodbye():print "hello!" # bug hereif…...

k8s-Pod域名学习总结

k8s-Pod域名学习总结 大纲 k8s内置DNS服务 配置Pod的域名服务 CornDNS配置 默认Pod的域名 自定义Pod的域名 实战需求 1 Pod有自己的域名 2 集群内部的Pod可以通过域名访问其他的Pod 基础准备&#xff1a; 1 k8s 集群版本1.17 k8s内置DNS服务 k8s1.17安装完成后自动创建…...

0405习题总结-不定积分

文章目录1 不定积分的基本概念2 直接积分法-基本积分公式3 第一换元法-凑微分形式法4 第二类换元法5 分部积分求不定积分6 表格法积分7 有理函数求积分后记1 不定积分的基本概念 例1 f(x){x1,x≥012e−x12,x<0求∫f(x)dxf(x) \begin{cases} x1,\quad x\ge0\\ \frac{1}{2}e^…...

QT 常用控件类型命名参考

拟定的QT的控件命名规则&#xff1a;蛇形命名方式 控件类型开头&#xff0c;以下是QT控件类型命名的参考范例 Buttons Buttons起始字符串对象名称举例Push Buttonbuttonbutton_loginTool Buttontool_button / buttonbutton_switchRadio Buttonradio_button / radioradio_boy…...

MATLAB与图像处理的那点小事儿~

目录 一、学习内容 二、matlab基本知识 三、线性点运算 四、非线性点运算&#xff0c;伽马矫正 五、直方图 1、直方图均衡化 &#xff08;1&#xff09;使用histep函数实现图像均衡化 &#xff08;2&#xff09;使用自行编写的均衡化函数实现图像均衡化 2、直方图规定…...

第十四届蓝桥杯模拟赛(第三期)Java组个人题解

第十四届蓝桥杯模拟赛&#xff08;第三期&#xff09;Java组个人题解 今天做了一下第三期的校内模拟赛&#xff0c;有些地方不确定&#xff0c;欢迎讨论和指正~ 文章目录第十四届蓝桥杯模拟赛&#xff08;第三期&#xff09;Java组个人题解填空题部分第一题【最小数】第二题【E…...

Go语言之条件判断循环语句(if-else、switch-case、for、goto、break、continue)

一、if-else条件判断语句 Go中的if-else条件判断语句跟C差不多。但是需要注意的是&#xff0c;Go中强制规定&#xff0c;关键字if和else之后的左边的花括号"{“必须和关键字在同一行&#xff0c;若使用了else if结构&#xff0c;则前段代码快的右花括号”}"必须和关…...

深入理解AQS

概念设计初衷&#xff1a;该类利用 状态队列 实现了一个同步器&#xff0c;更多的是提供一些模板方法&#xff08;子类必须重写&#xff0c;不然会抛错&#xff09;。 设计功能&#xff1a;独占、共享模式两个核心&#xff0c;state、Queue2.1 statesetState、compareAndSetSta…...

JVM学习笔记十:执行引擎

0. 前言 声明&#xff1a; 感谢尚硅谷宋红康老师的讲授。 感谢广大网友共享的笔记内容。 B站&#xff1a;https://www.bilibili.com/video/BV1PJ411n7xZ 本文的内容基本来源于宋老师的课件&#xff0c;其中有一些其他同学共享的内容&#xff0c;也有一些自己的理解内容。 1. …...

【2023-03-10】JS逆向之美团滑块

提示&#xff1a;文章仅供参考&#xff0c;禁止用于非法途径 前言 目标网站:aHR0cHM6Ly9wYXNzcG9ydC5tZWl0dWFuLmNvbS9hY2NvdW50L3VuaXRpdmVsb2dpbg 页面分析 接口流程 1.https://passport.meituan.com/account/unitivelogin主页接口&#xff1a;需获取下面的参数&#xff0…...

全志V853芯片放开快启方案打印及在快起方式下配置isp led的方法

全志V85x芯片 如何放开快启方案的打印&#xff1f; 1.主题 如何放开快启方案的打印 2.问题背景 产品&#xff1a;v851系列快启方案 软件&#xff1a;tina 其他&#xff1a;特有版本信息添加自由描述 &#xff08;如固件版本&#xff0c;复现概率&#xff0c;特定环境&#x…...

大数据 | (一)Hadoop伪分布式安装

大数据原理与应用教材链接&#xff1a;大数据技术原理与应用电子课件-林子雨编著 Hadoop伪分布式安装借鉴文章&#xff1a;Hadoop伪分布式安装-比课本详细 大数据 | &#xff08;二&#xff09;SSH连接报错Permission denied&#xff1a;SSH连接报错Permission denied 哈喽&a…...

Django/Vue实现在线考试系统-06-开发环境搭建-Django安装

1.0 基本介绍 Django 是一个由 Python 编写的一个开放源代码的 Web 应用框架。 使用 Django,只要很少的代码,Python 的程序开发人员就可以轻松地完成一个正式网站所需要的大部分内容,并进一步开发出全功能的 Web 服务 Django 本身基于 MVC 模型,即 Model(模型)+ View(…...

网络六边形受到攻击

大家读完觉得有帮助记得关注和点赞&#xff01;&#xff01;&#xff01; 抽象 现代智能交通系统 &#xff08;ITS&#xff09; 的一个关键要求是能够以安全、可靠和匿名的方式从互联车辆和移动设备收集地理参考数据。Nexagon 协议建立在 IETF 定位器/ID 分离协议 &#xff08;…...

脑机新手指南(八):OpenBCI_GUI:从环境搭建到数据可视化(下)

一、数据处理与分析实战 &#xff08;一&#xff09;实时滤波与参数调整 基础滤波操作 60Hz 工频滤波&#xff1a;勾选界面右侧 “60Hz” 复选框&#xff0c;可有效抑制电网干扰&#xff08;适用于北美地区&#xff0c;欧洲用户可调整为 50Hz&#xff09;。 平滑处理&…...

在鸿蒙HarmonyOS 5中实现抖音风格的点赞功能

下面我将详细介绍如何使用HarmonyOS SDK在HarmonyOS 5中实现类似抖音的点赞功能&#xff0c;包括动画效果、数据同步和交互优化。 1. 基础点赞功能实现 1.1 创建数据模型 // VideoModel.ets export class VideoModel {id: string "";title: string ""…...

《通信之道——从微积分到 5G》读书总结

第1章 绪 论 1.1 这是一本什么样的书 通信技术&#xff0c;说到底就是数学。 那些最基础、最本质的部分。 1.2 什么是通信 通信 发送方 接收方 承载信息的信号 解调出其中承载的信息 信息在发送方那里被加工成信号&#xff08;调制&#xff09; 把信息从信号中抽取出来&am…...

解决本地部署 SmolVLM2 大语言模型运行 flash-attn 报错

出现的问题 安装 flash-attn 会一直卡在 build 那一步或者运行报错 解决办法 是因为你安装的 flash-attn 版本没有对应上&#xff0c;所以报错&#xff0c;到 https://github.com/Dao-AILab/flash-attention/releases 下载对应版本&#xff0c;cu、torch、cp 的版本一定要对…...

第 86 场周赛:矩阵中的幻方、钥匙和房间、将数组拆分成斐波那契序列、猜猜这个单词

Q1、[中等] 矩阵中的幻方 1、题目描述 3 x 3 的幻方是一个填充有 从 1 到 9 的不同数字的 3 x 3 矩阵&#xff0c;其中每行&#xff0c;每列以及两条对角线上的各数之和都相等。 给定一个由整数组成的row x col 的 grid&#xff0c;其中有多少个 3 3 的 “幻方” 子矩阵&am…...

【Oracle】分区表

个人主页&#xff1a;Guiat 归属专栏&#xff1a;Oracle 文章目录 1. 分区表基础概述1.1 分区表的概念与优势1.2 分区类型概览1.3 分区表的工作原理 2. 范围分区 (RANGE Partitioning)2.1 基础范围分区2.1.1 按日期范围分区2.1.2 按数值范围分区 2.2 间隔分区 (INTERVAL Partit…...

html css js网页制作成品——HTML+CSS榴莲商城网页设计(4页)附源码

目录 一、&#x1f468;‍&#x1f393;网站题目 二、✍️网站描述 三、&#x1f4da;网站介绍 四、&#x1f310;网站效果 五、&#x1fa93; 代码实现 &#x1f9f1;HTML 六、&#x1f947; 如何让学习不再盲目 七、&#x1f381;更多干货 一、&#x1f468;‍&#x1f…...

使用Matplotlib创建炫酷的3D散点图:数据可视化的新维度

文章目录 基础实现代码代码解析进阶技巧1. 自定义点的大小和颜色2. 添加图例和样式美化3. 真实数据应用示例实用技巧与注意事项完整示例(带样式)应用场景在数据科学和可视化领域,三维图形能为我们提供更丰富的数据洞察。本文将手把手教你如何使用Python的Matplotlib库创建引…...

【Nginx】使用 Nginx+Lua 实现基于 IP 的访问频率限制

使用 NginxLua 实现基于 IP 的访问频率限制 在高并发场景下&#xff0c;限制某个 IP 的访问频率是非常重要的&#xff0c;可以有效防止恶意攻击或错误配置导致的服务宕机。以下是一个详细的实现方案&#xff0c;使用 Nginx 和 Lua 脚本结合 Redis 来实现基于 IP 的访问频率限制…...