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

Linux:信号保存与处理

使用kill -l命令查看信号:

信号量和信号确实一点关系没有

信号是操作系统发出的进程与进程之间的通知于中断,是进程之间时间异步通知的一种方式

先了解同步通信:同步通信是一种比特同步通信技术,要求发收双方具有同频同相的同步时钟信号,只需在传送报文的最前面附加特定的同步字符,使发收双方建立同步,此后便在同步时钟的控制下逐位发送/接收。

优点是效率高,缺点是硬件要求高

什么叫异步通信:异步通信是指发送方在向接收方发送数据的时候可以有任意的时间间隔,没有严格的时序要求,而接收方需要一直存在,来接收数据

优点是便宜,缺点是效率低

信号量是一个计时器,表示可用资源的数量

进程产生信号的方式有四种

通过终端按键发出信号

例如你输入ctrl c的时候可以中断进程,ctrl \是离开信号,ctrl z是暂停信号

这些信号分别对应了上图的2信号,3信号,20信号

通过系统调用函数产生信号

kill命令在实现的时候也是调用kill函数实现的,kill函数可以给指定进程发送指定的信号

#include<signal.h>

int kill(pid_t pid,int signo);

来写一个kill函数的调用:

mykill:

#include<stdio.h>
#include<signal.h>
#include<sys/types.h>
#include<unistd.h>
#include<stdlib.h>
int main(int argc,char *argv[]){if(argc!=3){perror("kill false");return 1;}pid_t pid=atoi(argv[2]);int sig=atoi(argv[1]);kill(pid,sig);//啊啊啊啊,一开始写反参数的顺序了,气死了return 0;
}

myprocess.c:

#include<stdio.h>
#include<signal.h>
#include<sys/types.h>
#include<unistd.h>
void handler(int sig){printf("get a sig form myskill,sig==%d",sig);
}int main(){signal(2,handler);//signal是个系统调用函数,第一个参数是输入的信号是几,第二个参数有三种类型//此处的类型为一个函数指针,在执行该语句的时候执行一个handler函数,这个函数是要自己声明的//格式为int handler(int sig)while(1){printf("a process,pid==%d\n",getpid());fflush(stdout);sleep(1);}return 0;
}

除了kill函数还有abort函数,使当前进程接收到信号而异常终止

#include<stdlib.h>

void abort(void)

用go也写一个:

package mainimport ("fmt""os""os/signal""syscall"
)func main() {sigs := make(chan os.Signal, 1)done := make(chan bool, 1)signal.Notify(sigs, syscall.SIGINT, syscall.SIGTERM) //将sigint和sigterm的信号传给sig//process start//get a sig interrupt,这个interrupt就是syscall.SIGINT返回的信号go func() {sig := <-sigs//将信号发送给sigfmt.Println("get a sig", sig)done <- true//标为结束}()fmt.Println("process start")<-done
}

myabort.c:

#include<signal.h>
#include<sys/types.h>
#include<unistd.h>
#include<stdlib.h>
void handler(int sig){printf("get a sig");
}
int main(){signal(3,handler);//捕获信号while(1){sleep(1);abort();//捕获之后就终止进程,因为abort就是终止}return 0;
}

那abort()函数收到信号会终止,那么是不是我让他捕捉所有的信号,就不能终止我的进程了?

void catchSig(int signum)
{printf("get a signal:%d",signum);
}
int main()
{for(int sig = 1; sig <= 31; sig++) {signal(sig, catchSig);}while(true){sleep(1);}return 0;
}

信号9不能被自动捕捉哦

但是我们还是可以用kill -9 pid来终止该进程:

还有raise,是给自己当前的进程发送信号:

#include<stdio.h>
#include<signal.h>
#include<sys/types.h>
#include<unistd.h>
#include<stdlib.h>
void handler(int sig){printf("get a sig,sig==%d\n",sig);fflush(stdout);
}
int main(){signal(3,handler);while(1){sleep(1);raise(3);//给当前进程发送信号3}return 0;
}

由软件条件产生的信号

上图的信号13是一个管道中由软件产生的信号,读端关闭,写端一直写入的时候,os会直接啥的写端进程,怎么杀掉呢?通过向目标文件发送SIGPIPE(13)信号,终止目标进程,这就叫软件条件

由硬件异常生成的信号

硬件发生异常后以某种方式被检测到并且通知到内核,内核再向进程发送适当的信号(也是设计到软件条件产生的信号)

软件条件和硬件异常的产生的信号的区别:软件条件就是操作系统和应用程序内部生成的,硬件信号是物理设备(外设)通过中断机制发送

进程递达,阻塞和捕捉

一个信号在发送给一个进程的时候需要三个阶段:这个信号我收不收?这个信号我要不要写入?我写入/或者不写入用不用?

表现出来就是一个task_struct下的三个标志位:block(要不要阻塞,对应前面的这个信号我收不收),pending(bit位的位置表示编号,不同位置代表不同的信号,对应位置的信号写入,则置为1,否则置为0),例如,block 位图的最低一个比特位就表示是否对 1 号信号进行阻塞,pending 位图的最低一个比特位就表示是否收到 1 号信号。

bandler(这个信号我要不要忽视=这个信号我用不用)

阻塞和忽略是不同的,阻塞是不接收这个信号,忽略是接收这个信号,写入该信号,但是不执行这个信号;也就是说信号被阻塞就不能递达,递达之后才能选择你能不能忽略

信号递达:执行信号的处理动作称为信号递达(Delivery)

信号从产生到递达(从有信号到执行信号的状态)称为信号未决(Pending)

信号集

能表示多个信号的一种数据类型,叫信号集(signal set,信号集其实就是 sigset_t 类型数据结构)

在阻塞信号集下的每个信号的“有效”和“无效”指的是这个信号有没有被阻塞,在未决信号集下的有无效是指是否处于未决状态

阻塞信号集也叫信号屏蔽字(Signal Mask),这里的屏蔽的意思==阻塞

sigset_t下的每个信号都用每个bit来判定信号是有效还是无效

设置信号集

通过函数设置信号集

#include <signal.h>
int sigemptyset(sigset_t *set);
int sigfillset(sigset_t *set);
int sigaddset (sigset_t *set, int signo);
int sigdelset(sigset_t *set, int signo);
int sigismember(const sigset_t *set, int signo);

我们来解释一下这些函数

sigemptyset(),用于清空(初始化)信号集,使其中所有的信号对应的bit清零,表示该信号集不包含有效信号

sigfillset(),也是初始化信号集内的信号,但是与sigemptyset()的区别是sigfillset()是置位,全部置为有效信号

每次使用sigset_t类型的变量之前,一定要调用sigemptyset或sigfillset做初始化,初始化后就可以调用其他的如sigaddset或sigdelset做添加或删除某种有效信号

这四个函数的返回值都是成功返回0,失败返回-1

而sigismember是个bool类型的函数,用于判断该信号集是否包含某种信号,包含返回1,不包含返回0,出错返回-1

维护信号集

调用函数sigprocmask()可以读取或更改进程的信号屏蔽字,也就是阻塞信号集

#include <signal.h>
int sigprocmask(int how, const sigset_t *set, sigset_t *oset);
// 返回值:若成功则为0,若出错则为-1

若oset是非空指针,则读取进程的当前信号屏蔽字通过oset参数传出(输出型参数)

如果set是非空指针,则更改进程的信号屏蔽字,参数how指示如何更改

如果oset和set都是非空指针,则将原来的信号屏蔽字备份到oset里,然后根据how和set来修改信号屏蔽字

若mask是我们当前的信号屏蔽字,这是how的可选选项

如果调用 sigprocmask 解除了对当前若干个未决信号的阻塞,则在sigprocmask返回前,至少将其中一个信号递达。

原理:一个信号被阻塞,也就是在信号屏蔽字内的时候,就处于未决状态;当调用过sigprocmask就意味着至少有一个信号得进入递达状态(内核至少递送一个信号)

读取当前进程的信号集

#include <signal.h>
sigpending(&s);

sigpending 函数可以读取当前进程的未决信号集,通过 s 参数传出。调用成功则返回0,出错则返回-1。

信号捕捉的过程

信号在内核态返回到用户态进行信号的检测和处理

如果处理信号的函数是用户自定义的函数,那么在信号递达的时候调用这个函数,称为捕捉信号。

在信号捕捉中,一共会涉及到四次状态转换

可重入函数

可重入函数(reentrant function)是指在多个执行流下,能够被同时调用而不会产生冲突或错误的函数。

这种函数能够保证在任意时刻,无论被同一个还是不同执行流调用,都能正确地完成预期的功能。

如果一个函数符合以下条件之一则是不可重入的:

调用了malloc或free,因为malloc也是用全局链表来管理堆的。
调用了标准I/O库函数,标准I/O库的很多实现都以不可重入的方式使用全局数据结构。

相关文章:

Linux:信号保存与处理

使用kill -l命令查看信号&#xff1a; 信号量和信号确实一点关系没有 信号是操作系统发出的进程与进程之间的通知于中断&#xff0c;是进程之间时间异步通知的一种方式 先了解同步通信&#xff1a;同步通信是一种比特同步通信技术&#xff0c;要求发收双方具有同频同相的同步…...

工具方法 - 可选的一些AI聊天机器人

1, ChatGPT OpenAI https://chatgpt.com/ 2, Microsoft Copilot Microsoft Copilot: 你的 AI 助手 Microsoft Copilot: 你的 AI 助手 3, HuggingChat Hugging Face – The AI community building the future. https://huggingface.co/ https://huggingface.co/chat/ 4,…...

YOLOv11改进策略【卷积层】| CVPR-2023 ScConv:即插即用,减少冗余计算并提升特征学习

一、本文介绍 本文记录的是利用ScConv优化YOLOv11的目标检测网络模型。深度神经网络中存在大量冗余,不仅在密集模型参数中,而且在特征图的空间和通道维度中。ScConv模块通过联合减少卷积层中空间和通道的冗余,有效地限制了特征冗余,本文利用ScConv模块改进YOLOv11,提高了…...

总结拓展十四:批次管理(2)

1、批次管理后台配置 1.1 批次管理级别配置(T-code:OMTC) ——路径&#xff1a;IMG->后勤-常规->批次管理->指定级别并激活状态管理 1.2 批次状态管理配置(T-code:OMTC) ——路径&#xff1a;IMG->后勤-常规->批次管理->指定级别并激活状态管理 批状态管…...

架构设计笔记-18-安全架构设计理论与实践

知识要点 常见的安全威胁&#xff1a; 信息泄露&#xff1a;信息被泄露或透露给某个非授权的实体。破坏信息的完整性&#xff1a;数据被非授权地进行增删、修改或破坏而受到损失。拒绝服务&#xff1a;对信息或其他资源的合法访问被无条件地阻止。攻击者向服务器发送大量垃圾…...

Python网络爬虫

随着互联网的迅猛发展&#xff0c;数据成为了新的“石油”。人们对于信息的需求日益增涨&#xff0c;尤其是在市场分析、学术研究和数据挖掘等领域。网络爬虫作为一种自动提取网络数据的技术&#xff0c;因其强大的能力而备受关注。而Python&#xff0c;凭借其简洁的语法和丰富…...

38. 外观数列

目录 一、问题描述 二、解题思路 三、代码 四、复杂度分析 一、问题描述 「外观数列」是一个数位字符串序列&#xff0c;由递归公式定义&#xff1a; countAndSay(1) "1"countAndSay(n) 是 countAndSay(n-1) 的行程长度编码。 行程长度编码&#xff08;RLE&am…...

Android中的三种数据存储方式

目录 1.文件存储 1&#xff09;内部存储 1--MODE_PRIVATE: 2--MODE_APPEND: 3--MODE_WORLD_READABLE: 4--MODE_WORLD_WRITEABLE: 5--简单使用 3&#xff09;外部存储 4&#xff09;内部读取 4&#xff09;外部读取 2.SharePreferences存储 1&#xff09;基本概念 2&#xff09…...

VS2022中Qt环境配置步骤

VS2022中Qt环境配置步骤 一、安装QT 下载QT&#xff1a;从QT官网上下载QT&#xff0c;在安装过程中&#xff0c;可以根据自己的需求选择适合的QT版本。若不确定&#xff0c;建议选择最新版本&#xff0c;这有助于提高开发效率。 二、安装Visual Studio 2022 选择组件&#…...

【前端】 常用的版本控制符号汇总

前端的版本控制符主要用于管理前端项目中依赖包的版本。它们通常在package.json文件中定义&#xff0c;帮助开发者指定所需的库和框架的版本范围。以下是一些关键概念&#xff1a; 版本控制符号详解&#xff1a; 1. 依赖管理 在前端开发中&#xff0c;依赖管理工具&#xff…...

OWASP Top 10 漏洞详解:基础知识、面试常问问题与实际应用

OWASP&#xff08;开放式Web应用程序安全项目&#xff09;是一个全球性非营利组织&#xff0c;致力于提高软件安全性。OWASP Top 10 是其发布的十大Web应用程序安全风险列表&#xff0c;广泛应用于安全领域的学习和实践。本文将详细介绍OWASP Top 10 漏洞的基础知识、面试常见问…...

实景三维赋能自然资源精细化管理创新

在自然资源管理领域&#xff0c;如何实现精细化、高效化管理一直是我们面临的挑战。随着实景三维技术的兴起&#xff0c;这一挑战迎来了新的解决方案。今天&#xff0c;我们将探讨实景三维技术如何赋能自然资源的精细化管理。 1. 实景三维技术概述 实景三维技术是一种集成了遥…...

Science Robotics 通过新材料打造FiBa软机器人 可实现四种形态进化

近几年由于材料科学的进步&#xff0c;软机器人相关技术近几年研究成果显著&#xff0c;与传统的刚性机器人相比&#xff0c;软机器人的设计灵感来源于自然界中的生物系统&#xff0c;如蠕虫、章鱼、壁虎和青蛙等。这些生物利用柔软、有弹性的材料&#xff0c;在复杂环境中展现…...

C++ 的特性可以不用在主函数中调用

写完代码,都找不到从哪里进去...

香港大学神作 LightRAG 横空出世!AI 检索生成系统革命,秒懂复杂信息,动态数据无所遁形!

❤️ 如果你也关注大模型与 AI 的发展现状&#xff0c;且对大模型应用开发非常感兴趣&#xff0c;我会快速跟你分享最新的感兴趣的 AI 应用和热点信息&#xff0c;也会不定期分享自己的想法和开源实例&#xff0c;欢迎关注我哦&#xff01; 微信订阅号&#xff5c;搜一搜&…...

云栖实录 | 智能运维年度重磅发布及大模型实践解读

本文根据2024云栖大会实录整理而成&#xff0c;演讲信息如下&#xff1a; 演讲人&#xff1a; 钟炯恩 | 阿里云智能集团运维专家 张颖莹 | 阿里云智能集团算法专家 活动&#xff1a; 2024 云栖大会 AI 可观测专场 -智能运维&#xff1a;云原生大规模集群GitOps实践 2024 …...

Vue3中防止按钮重复点击的方式

本文列两种方式&#xff0c;推荐第一种&#xff0c;经过长时间测试第二种防止的还是会漏&#xff0c;这里也列一下 ①使用定时器&#xff08;推荐&#xff09; 判断3秒钟之内方法只能执行一次 <el-button click"handleClick" type"primary" :loading…...

windows主机重新安装zabbix agent提示please clear the previous agent registration

目录 1. Zabbix Agent1.1 错误提示 2. 解决方法2.1 管理员运行cmd2.2 可以正常安装 1. Zabbix Agent 1.1 错误提示 2. 解决方法 2.1 管理员运行cmd 输入 sc.exe delete “Zabbix Agent” 或者 sc.exe delete “Zabbix Agent 2” 如果成功会出现“[SC] DeleteService SUCCES…...

一个将.Geojson文件转成shapefile和kml文件的在线页面工具

最近需要读取.geojson格式的流域边界文件。在谷歌地球桌面版和globalMapper中均无法正常读取。下面我发现的一个在线的平台可以很好实现这一功能。 GeoJSON to SHP Converter Online - MyGeodata Cloud ❤️欢迎点赞收藏❤️...

Mamba学习笔记(1)——原理基础

文章目录 Mamba: Linear-Time Sequence Modeling with Selective State Spaces0 Abstract1 Introduction2 State Space Models3 Selective State Space Models3.1 Motivation: Selection as a Means of Compression3.2 Improving SSMs with Selection3.3 Efficient Implementat…...

第19节 Node.js Express 框架

Express 是一个为Node.js设计的web开发框架&#xff0c;它基于nodejs平台。 Express 简介 Express是一个简洁而灵活的node.js Web应用框架, 提供了一系列强大特性帮助你创建各种Web应用&#xff0c;和丰富的HTTP工具。 使用Express可以快速地搭建一个完整功能的网站。 Expre…...

日语AI面试高效通关秘籍:专业解读与青柚面试智能助攻

在如今就业市场竞争日益激烈的背景下&#xff0c;越来越多的求职者将目光投向了日本及中日双语岗位。但是&#xff0c;一场日语面试往往让许多人感到步履维艰。你是否也曾因为面试官抛出的“刁钻问题”而心生畏惧&#xff1f;面对生疏的日语交流环境&#xff0c;即便提前恶补了…...

python/java环境配置

环境变量放一起 python&#xff1a; 1.首先下载Python Python下载地址&#xff1a;Download Python | Python.org downloads ---windows -- 64 2.安装Python 下面两个&#xff0c;然后自定义&#xff0c;全选 可以把前4个选上 3.环境配置 1&#xff09;搜高级系统设置 2…...

uni-app学习笔记二十二---使用vite.config.js全局导入常用依赖

在前面的练习中&#xff0c;每个页面需要使用ref&#xff0c;onShow等生命周期钩子函数时都需要像下面这样导入 import {onMounted, ref} from "vue" 如果不想每个页面都导入&#xff0c;需要使用node.js命令npm安装unplugin-auto-import npm install unplugin-au…...

cf2117E

原题链接&#xff1a;https://codeforces.com/contest/2117/problem/E 题目背景&#xff1a; 给定两个数组a,b&#xff0c;可以执行多次以下操作&#xff1a;选择 i (1 < i < n - 1)&#xff0c;并设置 或&#xff0c;也可以在执行上述操作前执行一次删除任意 和 。求…...

P3 QT项目----记事本(3.8)

3.8 记事本项目总结 项目源码 1.main.cpp #include "widget.h" #include <QApplication> int main(int argc, char *argv[]) {QApplication a(argc, argv);Widget w;w.show();return a.exec(); } 2.widget.cpp #include "widget.h" #include &q…...

vue3 定时器-定义全局方法 vue+ts

1.创建ts文件 路径&#xff1a;src/utils/timer.ts 完整代码&#xff1a; import { onUnmounted } from vuetype TimerCallback (...args: any[]) > voidexport function useGlobalTimer() {const timers: Map<number, NodeJS.Timeout> new Map()// 创建定时器con…...

C# SqlSugar:依赖注入与仓储模式实践

C# SqlSugar&#xff1a;依赖注入与仓储模式实践 在 C# 的应用开发中&#xff0c;数据库操作是必不可少的环节。为了让数据访问层更加简洁、高效且易于维护&#xff0c;许多开发者会选择成熟的 ORM&#xff08;对象关系映射&#xff09;框架&#xff0c;SqlSugar 就是其中备受…...

Hive 存储格式深度解析:从 TextFile 到 ORC,如何选对数据存储方案?

在大数据处理领域&#xff0c;Hive 作为 Hadoop 生态中重要的数据仓库工具&#xff0c;其存储格式的选择直接影响数据存储成本、查询效率和计算资源消耗。面对 TextFile、SequenceFile、Parquet、RCFile、ORC 等多种存储格式&#xff0c;很多开发者常常陷入选择困境。本文将从底…...

佰力博科技与您探讨热释电测量的几种方法

热释电的测量主要涉及热释电系数的测定&#xff0c;这是表征热释电材料性能的重要参数。热释电系数的测量方法主要包括静态法、动态法和积分电荷法。其中&#xff0c;积分电荷法最为常用&#xff0c;其原理是通过测量在电容器上积累的热释电电荷&#xff0c;从而确定热释电系数…...