【linux】信号(下)
8. 阻塞信号
(一)信号其他相关常见概念
- 实际执行信号的处理动作称为信号递达(Delivery)
- 信号从产生到递达之间的状态,称为信号未决(Pending)
- 进程可以选择阻塞 (Block )某个信号
- 被阻塞的信号产生时将保持在未决状态,直到进程解除对此信号的阻塞,才执行递达的动作(即被阻塞的信号,进程是不会对其进行处理动作)
注意:
- 阻塞和忽略是不同的,只要信号被阻塞就不会递达,而忽略是在递达之后可选的一种处理动作
- 常规信号在递达之前产生多次只计一次,而实时信号在递达之前产生多次可以依次放在一个队列里
(二)sigset_t
从上图来看,每个信号只有一个bit的未决标志,非0即1,不记录该信号产生了多少次,阻塞标志也是这样表示的
因此,未决和阻塞标志可以用相同的数据类型sigset_t来存储,sigset_t称为信号集,这个类型可以表示每个信号 的“有效”或“无效”状态
在阻塞信号集中“有效”和“无效”的含义是该信号是否被阻塞,而在未决信号集中“有
效”和“无效”的含义是该信号是否处于未决状态
(三)信号集操作函数
#include <signal.h>
int sigemptyset(sigset_t *set);
清空set(即位图清空成0)
int sigfillset(sigset_t *set);
填满set(即位图上的32个比特位全是1)
int sigaddset (sigset_t *set, int signo);
设置set用位图表示的对应信号(即变成1)
int sigdelset(sigset_t *set, int signo);
取消set用位图表示的对应信号(即变成0)
int sigismember(const sigset_t *set, int signo);
判断set用位图表示的对应信号是否被设置(如果被设置,则返回1,如果没有,则返回0)
注意:
- 在使用sigset_ t类型的变量之前,一定要调 用sigemptyset或sigfillset做初始化,使信号集处于确定的状态
- 除了sigismember函数,其它四个函数都是成功返回0,出错返回-1
- sigismember是一个布尔函数,用于判断一个信号集的有效信号中是否包含某种信号,若包含则返回1,不包含则返回0,出错返回-1
(四)sigprocmask 函数
调用函数sigprocmask可以读取或更改进程的信号屏蔽字(阻塞信号集)
#include <signal.h>
int sigprocmask(int how, const sigset_t *set, sigset_t *oset);
参数:
how 参数:一般有三个选项
oset 参数:保存了上一次的阻塞信号集
返回值:若成功则为0,若出错则为-1
(五)sigpending 函数
读取当前进程的未决信号集,通过set参数传出。调用成功则返回0,出错则返回-1
#include <signal.h>
sigpending (const sigset_t *set)
使用 信号操作集函数,sigprocmask 函数,sigpending 函数
9. 捕捉信号
(一)捕捉信号的时机
当我们的进程从内核态返回到用户态的时候,进行信号的检测和处理
内核态:
允许进程访问内核区的数据和代码
用户态:
只允许进程访问自己用户区的数据和代码
注意:
- 对于进程来说,调用操作系统的方法,就是在进程地址空间中内核区找到对应的方法
- 操作系统的本质:基于时钟中断的死循环(操作系统也是一个进程,管理着各种软硬件,但同时它其实也是需要别人推进执行)
- 计算机硬件中有一个时钟芯片,每隔很短的一段时间,向计算机发送时钟中断
(二)信号捕捉的过程
(三)sigaction 函数
sigaction函数可以读取和修改与指定信号相关联的处理动作
#include <signal.h>
int sigaction(int signo, const struct sigaction *act, struct sigaction *oact);
返回值:调用成功则返回0,出错则返回- 1
注意:
若act指针非空,则根据act修改该信号的处理动作;若oact指针非空,则通过oact传出该信号原来的处理动作
act和oact指向sigaction结构体: 结构体中有 sa_handle 类型的变量 和 sa_mask变量
sigaction 函数 代码
注意:
- pending位图,从1->0的变化,是在执行捕捉方法之前,先清0,再调用
- 信号被处理的时候,对应的信号也会被添加到block表中(比如2号信号正在执行对应的处理动作,当此时还收到2号信号时,2号信号此时被设置成阻塞信息,也可以通过sigaction结构体中的sa_mask变量设置对应的阻塞信号集),防止信号捕捉被嵌套调用
10. 可重入函数
如果一个函数,被重复进入的情况下,可能会出错,则它是不可重入函数,否则,是可重入函数(比如链表的插入,如果有两个流都用同一个插入函数,执行同一个链表,可能会在插入时发生进程切换,导致一个流的插入函数没有执行完,就进行下一个流的插入,导致内存发生泄漏)
如果一个函数符合以下条件之一则是不可重入的:
- 调用了malloc或free,因为malloc也是用全局链表来管理堆的
- 调用了标准I/O库函数。标准I/O库的很多实现都以不可重入的方式使用全局数据结构
11. volatile 关键字
volatile 作用:保持内存的可见性(即CPU 可以从内存读取数据),防止编译器过度优化
12. SIGCHLD信号
子进程在终止时会给父进程发SIGCHLD信号(17号信号),该信号的默认处理动作是忽略,父进程在信号处理函数中调用wait清理子进程即可
要想不产生僵尸进程还有另外一种办法:父进程调用sigaction将SIGCHLD的处理动作设置为SIG_IGN,这样fork出来的子进程在终止时会自动清理掉,不 会产生僵尸进程,也不会通知父进程
注意:
- 系统默认的忽略动作和用户用sigaction函数自定义的忽略 通常是没有区别的,但这是一个特例
- 后一种方法对于Linux可用,但不保证在其它UNIX系统上都可用
相关文章:

【linux】信号(下)
8. 阻塞信号 (一)信号其他相关常见概念 实际执行信号的处理动作称为信号递达(Delivery)信号从产生到递达之间的状态,称为信号未决(Pending)进程可以选择阻塞 (Block )某个信号被阻塞的信号产生时将保持在未决状态,直到进程解除对此信号的阻塞,才执行递达的动作(即被阻塞的信…...
Notepad++ 初学者指南
引言 对于初学者来说,选择合适的编程工具很重要,特别是考虑到易用性和计算机资源的需求。 虽然集成开发环境(IDE)如 Eclipse、IntelliJ IDEA 和 Visual Studio 提供了许多强大的功能,但对于刚开始学习编程的人来说&a…...

Web Socket 使用详解
在信息爆炸的时代,用户对网页的期待早已超越了静态内容的展示。实时聊天、股票报价、协同编辑等功能的实现,都离不开服务器与客户端之间持续、高效的数据交互。传统的HTTP请求-响应模型难以满足这种需求,而WebSocket的出现,为构建…...

【Python Web开发】Python Web开发知识全解析
Python Web开发知识全解析 Python 是一种强大的编程语言,以其简洁和高效而闻名,尤其在 Web 开发领域,它有着广泛的应用。Python 提供了许多功能强大且灵活的 Web 框架,如 Flask、Django、FastAPI 等,使得构建现代 Web…...

Android开发展开收起功能
Android开发展开收起功能 文字过长展开收起功能很普通,也很需要。 一、思路: 自定义控件MoreTextView 二、效果图: 三、关键代码: public class MoreTextView2 extends LinearLayout {/*** TextView的实际高度*/private int …...

Sealos Devbox 发布,珍爱生命,远离 CI/CD
水滴攻击太阳系用的是最原始的攻击方式:撞击!却又如此有效率。 当我们搞了一堆容器、编排、CI/CD、DevOps,发明了一大堆没什么用的名词之后,最终发现这些操作都是花里胡哨,让开发者越陷越深。 最终你会发现一个真理&…...

数据结构——遍历二叉树
目录 什么是遍历二叉树 根据遍历序列确定二叉树 例题(根据先序中序以及后序中序求二叉树) 遍历的算法实现 先序遍历 中序遍历 后序遍历 遍历算法的分析 二叉树的层次遍历 二叉树遍历算法的应用 二叉树的建立 复制二叉树 计算二叉树深度 计算二…...

【Ubuntu】在Ubuntu上安装IDEA
【Ubuntu】在Ubuntu上安装IDEA 零、前言 最近换了Ubuntu系统,但是还得是要写代码,这样就不可避免地用到IDEA,接下来介绍一下如何在Ubuntu上安装IDEA。 壹、下载 这一步应该很容易的,直接打开IDEA的下载页面,点击下…...

解决:gpg: 从公钥服务器接收失败:服务器故障
当你添加密钥时报错,可以按照下面的步骤,依次输入。 # 停止 Network Manager 服务 sudo service network-manager stop# 删除 Network Manager 的状态文件 sudo rm /var/lib/NetworkManager/NetworkManager.state# 重新启动 Network Manager 服务 sudo …...

支持向量机SVM
目录 1 SVM直觉理解2. 软硬间隔3. 升维转换及核技巧入门 参考资料 1 SVM直觉理解 通过一条直线将两类数据分开,并且当有新的数据加入时,通过该条直线就能判别其属于哪一类 为了区分两类数据,N为数据的样本数,M为维度数…...
斯坦福UE4 C++课学习补充25:AI感知组件
文章目录 一、引入感知组件并绑定委托二、优化角色旋转 一、引入感知组件并绑定委托 PawnSensingComponent是UE中用于感知其他 Pawn(或 Actor)存在的一个组件,常用于 AI 角色的视觉、听觉等感知功能。它为 AI 提供了基础的感知能力ÿ…...
大模型 memory 记忆 缓存的应用
在探讨大模型的“memory”(记忆)功能时,我们通常会涉及缓存、存储以及如何有效管理和利用这些记忆来增强模型的性能。以下是对大模型memory记忆、缓存及相关概念的详细分析: 一、大模型的记忆功能 大模型,特别是大型…...
perl 给特定文件加上特定内容
perl 给特定文件加上特定内容 给所有的输入文件,加上特定的内容 本例中,给所有的输入文件内加入## Copyright xxx 如果检测到已经有## Copyright字样的行,那么不添加,具体代码如下。 可以使用该脚本,给所有的verilog文…...

全面解析网络性能监控系统与网络故障排除技巧,助力IT运维高效管理
目录 一、什么是网络性能监控系统? 1.1 网络性能监控系统的定义与作用 二、网络性能监控的关键指标 三、网络故障排除的重要性 3.1 为什么网络故障排除至关重要? 3.2 网络故障的常见类型 四、如何高效进行网络故障排除? 4.1 系统化的…...

Centos7 搭建单机elasticsearch
以下是在 CentOS 7 上安装 Elasticsearch 7.17.7 的完整步骤:(数据默认保存在/var/lib/elasticsearch下,自行更改) 一、装 Java 环境 Elasticsearch 是用 Java 编写的,所以需要先安装 Java 运行环境。 检查系统中是…...
【前端】Bootstrap:JavaScript 组件与插件
Bootstrap 不仅提供了强大的 CSS 工具和组件,还内置了丰富的 JavaScript 组件和插件。这些 JavaScript 组件能够增强网页的交互性,让开发者在不编写大量 JavaScript 代码的情况下快速实现各种动态效果。Bootstrap 的 JavaScript 组件基于 jQuery…...

部署 Open WebUI
1. 安装docker 2.启动Hyper-v 3.下载 安装 WSL wsl --update wsl --install 4. 打开 DeskDocker 5. 打开 运行 ollama 参考 Windows 部署 ollama-CSDN博客 6. 部署 运行 open webui docker docker run -d -p 3000:8080 --add-hosthost.docker.internal:host-gateway -v o…...

HUAWEI_HCIA_实验指南_Lib2.1_交换机基础配置
1、原理概述 交换机之间通过以太网电接口对接时需要协商一些接口参数,比如速率、双工模式等。交换机的全双工是指交换机在发送数据的同时也能够接收数据,两者同时进行。就如平时打电话一样,说话的同时也能够听到对方的声音。而半双工指在同一…...
第4天:用户界面和布局补充材料——`activity_login.xml`解读
下面是对“第4天:用户界面和布局补充材料”该文学习的更深层次的补充材料,对 activity_login.xml 文件的理解。 下面对activity_login.xml’ 文件中每一行进行详细解释: <?xml version"1.0" encoding"utf-8"?>声…...

《深入浅出LLM基础篇》(五):Propmt工程优化
🎉AI学习星球推荐: GoAI的学习社区 知识星球是一个致力于提供《机器学习 | 深度学习 | CV | NLP | 大模型 | 多模态 | AIGC 》各个最新AI方向综述、论文等成体系的学习资料,配有全面而有深度的专栏内容,包括不限于 前沿论文解读、…...

铭豹扩展坞 USB转网口 突然无法识别解决方法
当 USB 转网口扩展坞在一台笔记本上无法识别,但在其他电脑上正常工作时,问题通常出在笔记本自身或其与扩展坞的兼容性上。以下是系统化的定位思路和排查步骤,帮助你快速找到故障原因: 背景: 一个M-pard(铭豹)扩展坞的网卡突然无法识别了,扩展出来的三个USB接口正常。…...

EtherNet/IP转DeviceNet协议网关详解
一,设备主要功能 疆鸿智能JH-DVN-EIP本产品是自主研发的一款EtherNet/IP从站功能的通讯网关。该产品主要功能是连接DeviceNet总线和EtherNet/IP网络,本网关连接到EtherNet/IP总线中做为从站使用,连接到DeviceNet总线中做为从站使用。 在自动…...

【Oracle】分区表
个人主页:Guiat 归属专栏:Oracle 文章目录 1. 分区表基础概述1.1 分区表的概念与优势1.2 分区类型概览1.3 分区表的工作原理 2. 范围分区 (RANGE Partitioning)2.1 基础范围分区2.1.1 按日期范围分区2.1.2 按数值范围分区 2.2 间隔分区 (INTERVAL Partit…...
CMake控制VS2022项目文件分组
我们可以通过 CMake 控制源文件的组织结构,使它们在 VS 解决方案资源管理器中以“组”(Filter)的形式进行分类展示。 🎯 目标 通过 CMake 脚本将 .cpp、.h 等源文件分组显示在 Visual Studio 2022 的解决方案资源管理器中。 ✅ 支持的方法汇总(共4种) 方法描述是否推荐…...

RNN避坑指南:从数学推导到LSTM/GRU工业级部署实战流程
本文较长,建议点赞收藏,以免遗失。更多AI大模型应用开发学习视频及资料,尽在聚客AI学院。 本文全面剖析RNN核心原理,深入讲解梯度消失/爆炸问题,并通过LSTM/GRU结构实现解决方案,提供时间序列预测和文本生成…...

HarmonyOS运动开发:如何用mpchart绘制运动配速图表
##鸿蒙核心技术##运动开发##Sensor Service Kit(传感器服务)# 前言 在运动类应用中,运动数据的可视化是提升用户体验的重要环节。通过直观的图表展示运动过程中的关键数据,如配速、距离、卡路里消耗等,用户可以更清晰…...
QT3D学习笔记——圆台、圆锥
类名作用Qt3DWindow3D渲染窗口容器QEntity场景中的实体(对象或容器)QCamera控制观察视角QPointLight点光源QConeMesh圆锥几何网格QTransform控制实体的位置/旋转/缩放QPhongMaterialPhong光照材质(定义颜色、反光等)QFirstPersonC…...

人工智能(大型语言模型 LLMs)对不同学科的影响以及由此产生的新学习方式
今天是关于AI如何在教学中增强学生的学习体验,我把重要信息标红了。人文学科的价值被低估了 ⬇️ 转型与必要性 人工智能正在深刻地改变教育,这并非炒作,而是已经发生的巨大变革。教育机构和教育者不能忽视它,试图简单地禁止学生使…...

计算机基础知识解析:从应用到架构的全面拆解
目录 前言 1、 计算机的应用领域:无处不在的数字助手 2、 计算机的进化史:从算盘到量子计算 3、计算机的分类:不止 “台式机和笔记本” 4、计算机的组件:硬件与软件的协同 4.1 硬件:五大核心部件 4.2 软件&#…...

[大语言模型]在个人电脑上部署ollama 并进行管理,最后配置AI程序开发助手.
ollama官网: 下载 https://ollama.com/ 安装 查看可以使用的模型 https://ollama.com/search 例如 https://ollama.com/library/deepseek-r1/tags # deepseek-r1:7bollama pull deepseek-r1:7b改token数量为409622 16384 ollama命令说明 ollama serve #:…...