Linux高阶——1103——Signal信号机制
1、信号机制
在linux和unix系统下,如果想要处置(挂起,结束)进程,可以使用信号,经典消息机制,所以进程包括系统进程都是利用信号处置进程的
kill -l——查看所有系统支持的信号
1-31号信号——Unix经典信号,是软件研发工程师需要了解的信号
32-33号信号——被系统隐藏,归NPTL线程库使用,不开放
34-64号信号——自定义信号,驱动研发了解
2、触发信号的5种方式
ps aux——查看进程信息
1、终端组合按键触发信号
ctl+c——发2号信号SIGINT
ctl+\——发3号信号SIGQUIT
ctl+z——发20号信号SIGTSTP
唤醒——fg 进程号
2、命令触发信号
kill -signo pid——可以向任意进程发出任意信号
3、函数触发信号
#include<signal.h>
kill(pid_t pid,int signo);——向任意进程发送任意信号
raise(int signo);——向调用进程发送任意信号
abort(void)——向调用进程发送SIG_ABRT信号
./mykill 9 1000
mykill代码
#include<stdio.h>
#include<unistd.h>
#include<stdlib.h>
#include<string.h>
#include<signal.h>int main(int argc,char**argv)
{if(argc<3){ printf("mykill failed:pram error\n");exit(0);} kill(atoi(argv[2]),atoi(argv[1]));return 0;
}
4、硬件异常系统触发信号
当进程执行时,如果违规访问硬件,系统会发送对应的信号,杀死进程,避免访问
1、当进程中出现进程访问权限异常,例如只读内存写操作,产生段错误(内存核心已转储),系统发送SIGSEGV(11号)信号杀死目标进程
2、进程访问内存越界,触发总线错误(内存核心已转储),系统发送SIGBUS(7号)信号,杀死目标进程
3、进程使用cpu,计数异常,系统抛出浮点数例外(核心已转储),系统发送SIGFPE(8号)信号,杀死目标进程
5、软条件触发信号
在使用某个功能或设备时,当使用满足了软条件,系统会发送信号杀死进程
eg:
1、alarm定时器
用户可以自定义定时的时长,当定时的时间达到,系统会发送SIGALRM(14号)信号,但是信号会杀死进程
alarm定时器
#include<stdio.h>
#include<unistd.h>
#include<stdlib.h>
#include<string.h>
#include<signal.h>int main()
{int count=0;alarm(1);while(1){ printf("++count %d\n",++count);} return 0;
}
2、管道
管道读端关闭,写端向管道写数据,触发软条件,系统向写端发送SIGPIPE(13号)杀死进程
3、信号的行为或动作
系统中提供的信号一般都是用来杀死或挂起进程,信号的行为一般是被提前预设好的,但是可以修改,用户可以自定义变更行为和动作
SIGNAL一般有三种行为
1、SIG_DFL(默认行为:杀死目标)
是信号首选的默认行为
默认处理动作一般分为5种:
TERM——杀死进程
CORE——杀死进程并转储核心
IGN——不干预进程
STOP——挂起进程
COUNT——唤醒进程
2、SIG_IGN(忽略行为:放弃)
处理动作:NULL
3、SIG_ACTION(捕捉行为:自定义)
处理动作:自定义动作
捕捉函数
void sig_do(int n)
{printf("gfytguhbjgv"\n);
}
捕捉函数需要开发者自行定义与实现,但是只有信号触发抵达进程,系统自动调用
行为1中的忽略动作与行为2的忽略行为相比,结果一致,但是优先级不同,行为的优先级比动作高
每个信号拥有自己的信号行为结构体,struct sigaction,自己定义修改结构体,对进程原有的结构体进行替换,因为所有默认信号行为结构体中的行为都是默认的
处理行为设定
act.sa_handler=SIG_DFL/SIG_IGN/捕捉函数地址
默认选项
act.sa_flags=0;
临时屏蔽字,可以使用sigemptyset初始化
act.sa_mask;
结构体
struct sigaction act,oact;
void (*sa_handler)(int)
{act.sa_handler=SIG_DFL/SIG_IGN/捕捉函数地址act.sa_flags=0;act.sa_mask;
}
4、改变信号行为的方法
用自定义结构体替换原有的结构体
第一个参数是要修改的信号
第二个参数是新的结构体
第三个参数是原有的结构体
sigaction(SIGINT,&act,&oact);
替换修改信号行为结构体,一般情况下要传出进程原有的结构体,便于复位
虽然SIGINT代表的是2号信号,但是不能只传入2,因为不同电脑的信号名和编号不一定相同
eg:改变信号行为
#include<stdio.h>
#include<unistd.h>
#include<stdlib.h>
#include<string.h>
#include<signal.h>void sig_do(int n)
{int flags=3;while(flags--){ printf(" flag %d running...\n",flags);sleep(1);}
}int main()
{struct sigaction act,oact;act.sa_handler=sig_do;act.sa_flags=0;sigemptyset(&act.sa_mask);sigaction(SIGINT,&act,&oact);while(1)sleep(1);
}
改变后不能使用ctrl+c杀死程序
5、信号的传递与处理流程
1、信号由系统发出,传递到PCB
2、PCB中有一个位图,为64位,每一位对应一个信号,称为未决信号集
还有一个位图,为64位,每一位对应一个信号,称为屏蔽字
3、信号从系统发出后,还未到达未决信号集前称为待传递信号
信号能否通过未决信号集取决于未决信号集中的位码,1为不允许,0为允许
如果信号不被允许通过未决信号集,则该信号会被直接丢弃,放弃处理
4、如果信号通过了未决信号集,但还未抵达屏蔽字集,称为未决态信号,都是待处理信号
如果信号通过了未决信号集,系统会将对应的未决信号集的位码置1,如果有相同信号再次被传递过来,会被直接丢弃,因为系统拒绝相同的信号同时传递,未决信号集的变化是系统进程设置的
5、如果信号通过了屏蔽字集,称为递达态信号
当信号变为递达态后,未决信号集的位码会被归0
系统初始是避免相同信号递达的,因为会产生捕捉函数调用冲突,因此如果某个信号递达,系统会设置临时屏蔽,将对应的屏蔽字位置设置为1,当递达信号处理完毕后,再解除屏蔽
当信号变为递达态信号,则信号正在处理,进程将被处置,杀死或者挂起(见上面3)
6、信号阻塞
指的是信号通过了未决信号集,但是未通过屏蔽字
屏蔽字是开发者可以自行设置的,用于屏蔽阻塞某些特定信号
7、如果同时发多个信号,则系统只能处理前两个发过来的信号,其余的会被全部丢弃
因为屏蔽字会被临时置1,递达态信号处理完毕后,才会归0
8、Unix经典信号,不支持排队,但是可以多阻塞1个
9、自定义信号(34-64号)支持排队
因为经典信号(1-31号)的设计初衷是处置进程
自定义信号(34-64号)被设计出来为了软硬件设计,如:磁盘探针寻址寻道,用在上一页或下一页等操作上
相关文章:
Linux高阶——1103——Signal信号机制
1、信号机制 在linux和unix系统下,如果想要处置(挂起,结束)进程,可以使用信号,经典消息机制,所以进程包括系统进程都是利用信号处置进程的 kill -l——查看所有系统支持的信号 1-31号信号——Unix经典信号ÿ…...
如何编写STM32的定时器程序
编写STM32的定时器程序通常涉及以下步骤: 1. 选择定时器和时钟配置 首先,你需要选择一个可用的定时器(TIM),并配置其时钟源。时钟源可以是内部时钟或外部时钟,通常通过RCC(Reset and Clock Con…...

【C++】C++的单例模式、跟踪内存分配的简单方法
二十四、C的单例模式、跟踪内存分配的简单方法 1、C的单例模式 本小标题不是讨论C的语言特性,而是一种设计模式,用于确保一个类在任何情况下都只有一个实例,并提供一个全局访问点来获取这个实例。即C的单例模式。这种模式常用于资源管理&…...

构建一个导航栏web
<!DOCTYPE html> <html><head><meta charset"utf-8"><title></title><style>*{margin: 0;padding: 0;}#menu{background-color:purple;width: 100px;height: 50px;}.item{float: left;/* 浮动标签可以让块标签,…...
【Linux】Linux安全与密钥登录指南
在使用Linux服务器时,确保服务器的安全至关重要。本文将为你介绍一些关键的Linux安全措施,包括开启密钥登录、查看登录日志、限制登录IP以及查看系统中能够登录的账号。以下内容适合小白用户,通过简单的操作就能有效提升服务器的安全性。 目录…...

数据采集之scrapy框架
本博文使用基本框架完成搜房网或者其他网站的数据爬取(重点理解 scrapy 框架的构建过程,使用回调函数,完成数据采集和数据处理) 包结构目录如下图所示: 主要代码: (sfw.py) # -*- …...

ReactPress—基于React的免费开源博客CMS内容管理系统
ReactPress Github项目地址:https://github.com/fecommunity/reactpress 欢迎提出宝贵的建议,感谢Star。 {int sum 0;…...

期权交易策略 v0.1
一.概述 1.参考 <期权波动率与定价> 2.期权价格 标的现价100元,到期日价格可能情况如下。 价格 80 90 100 110 120 概率 20% 20% 20% 20% 20% 持有标的时,期望收益为0.如果持有100的看涨期权,忽略期权费,期望收益为(100-100)*0.2…...

pytorch学习:矩阵分解:奇异值分解(SVD分解)
前言 矩阵分解(Matrix Decomposition)是将一个矩阵分解成多个矩阵的乘积的过程,这种分解方法在计算、机器学习和线性代数中有广泛应用。不同的分解方式可以简化计算、揭示矩阵的内在结构或提高算法的效率。 奇异值分解 奇异值分解…...

接口测试用例设计的关键步骤与技巧解析!
简介 接口测试在需求分析完成之后,即可设计对应的接口测试用例,然后根据用例进行接口测试。接口测试用例的设计也需要用到黑盒测试用例设计方法,和测试流程与理论章节的功能测试用例设计的方法类似,设计过程中还需要增加与接口特…...

CSS画icon图标系列(一)
目录 前言: 一、向右箭头 1.原理: 2.代码实现 3.结果展示: 二、钟表 1.原理: 2.代码展示: 3.最终效果: 三、小手机 1.原理: 2.代码展示: 3.最后效果: 四、结…...
【数据结构-合法括号字符串】【华为笔试题】力扣1190. 反转每对括号间的子串
给出一个字符串 s(仅含有小写英文字母和括号)。 请你按照从括号内到外的顺序,逐层反转每对匹配括号中的字符串,并返回最终的结果。 注意,您的结果中 不应 包含任何括号。 示例 1: 输入:s “…...

qt QFileInfo详解
1、概述 QFileInfo是Qt框架中用于获取文件信息的工具类。它提供了与操作系统无关的文件属性,如文件的名称、位置(路径)、访问权限、类型(是否为目录或符号链接)等。此外,QFileInfo还可以获取文件的大小、创…...

金华迪加 现场大屏互动系统 mobile.do.php 任意文件上传漏洞复现
0x01 产品简介 金华迪加现场大屏互动系统是一种集成了先进技术和创意设计的互动展示解决方案,旨在通过大屏幕和多种交互方式,为观众提供沉浸式的互动体验。该系统广泛应用于各类活动、展览、会议等场合,能够显著提升现场氛围和参与者的体验感。 0x02 漏洞概述 金华迪加 现…...

探寻5G工业网关市场,5G工业网关品牌解析
随着5G技术的浪潮席卷全球,工业领域正经历着一场前所未有的变革。5G工业网关,作为连接工业设备与云端的桥梁,以其高速、低延迟的数据传输能力和强大的边缘计算能力,成为推动工业数字化转型的关键力量。那么,在众多5G工…...

RK3568开发板静态IP地址配置
1. 连接SSH MYD-LR3568 开发板设置了静态 eth0:1 192.168.0.10 和 eth1:1 192.168.1.10,在没有串口时调试开发板,可以用工具 SSH 登陆到开发板。 首先需要用一根网线直连电脑和开发板,或者通过路由器连接到开发板,将电脑 IP 手动设…...

element-plus table tableRowClassName 无效
官网上给的是 .el-table .warning-row {--el-table-tr-bg-color: var(--el-color-warning-light-9); } .el-table .success-row {--el-table-tr-bg-color: var(--el-color-success-light-9); } 但是 如果 加上了 scoped 这样样式是无效的 在 vue3 中用样式穿透 即可生…...

商务英语学习柯桥学外语到泓畅-老外说“go easy on me”是什么意思?
在口语中“go easy on sb ”这个短语是很常见的 01 go easy on me 怎么理解? 在口语中,“go easy on me”是一个非常常见的表达,通常表示请求对方在某方面对自己宽容一些,不要对自己太过苛刻或严厉。 短语(goÿ…...
rknn优化教程(二)
文章目录 1. 前述2. 三方库的封装2.1 xrepo中的库2.2 xrepo之外的库2.2.1 opencv2.2.2 rknnrt2.2.3 spdlog 3. rknn_engine库 1. 前述 OK,开始写第二篇的内容了。这篇博客主要能写一下: 如何给一些三方库按照xmake方式进行封装,供调用如何按…...

Python爬虫(一):爬虫伪装
一、网站防爬机制概述 在当今互联网环境中,具有一定规模或盈利性质的网站几乎都实施了各种防爬措施。这些措施主要分为两大类: 身份验证机制:直接将未经授权的爬虫阻挡在外反爬技术体系:通过各种技术手段增加爬虫获取数据的难度…...
Spring AI 入门:Java 开发者的生成式 AI 实践之路
一、Spring AI 简介 在人工智能技术快速迭代的今天,Spring AI 作为 Spring 生态系统的新生力量,正在成为 Java 开发者拥抱生成式 AI 的最佳选择。该框架通过模块化设计实现了与主流 AI 服务(如 OpenAI、Anthropic)的无缝对接&…...

Android15默认授权浮窗权限
我们经常有那种需求,客户需要定制的apk集成在ROM中,并且默认授予其【显示在其他应用的上层】权限,也就是我们常说的浮窗权限,那么我们就可以通过以下方法在wms、ams等系统服务的systemReady()方法中调用即可实现预置应用默认授权浮…...

深入解析C++中的extern关键字:跨文件共享变量与函数的终极指南
🚀 C extern 关键字深度解析:跨文件编程的终极指南 📅 更新时间:2025年6月5日 🏷️ 标签:C | extern关键字 | 多文件编程 | 链接与声明 | 现代C 文章目录 前言🔥一、extern 是什么?&…...
CSS设置元素的宽度根据其内容自动调整
width: fit-content 是 CSS 中的一个属性值,用于设置元素的宽度根据其内容自动调整,确保宽度刚好容纳内容而不会超出。 效果对比 默认情况(width: auto): 块级元素(如 <div>)会占满父容器…...

安宝特方案丨船舶智造的“AR+AI+作业标准化管理解决方案”(装配)
船舶制造装配管理现状:装配工作依赖人工经验,装配工人凭借长期实践积累的操作技巧完成零部件组装。企业通常制定了装配作业指导书,但在实际执行中,工人对指导书的理解和遵循程度参差不齐。 船舶装配过程中的挑战与需求 挑战 (1…...

视觉slam十四讲实践部分记录——ch2、ch3
ch2 一、使用g++编译.cpp为可执行文件并运行(P30) g++ helloSLAM.cpp ./a.out运行 二、使用cmake编译 mkdir build cd build cmake .. makeCMakeCache.txt 文件仍然指向旧的目录。这表明在源代码目录中可能还存在旧的 CMakeCache.txt 文件,或者在构建过程中仍然引用了旧的路…...

使用LangGraph和LangSmith构建多智能体人工智能系统
现在,通过组合几个较小的子智能体来创建一个强大的人工智能智能体正成为一种趋势。但这也带来了一些挑战,比如减少幻觉、管理对话流程、在测试期间留意智能体的工作方式、允许人工介入以及评估其性能。你需要进行大量的反复试验。 在这篇博客〔原作者&a…...
MySQL 8.0 事务全面讲解
以下是一个结合两次回答的 MySQL 8.0 事务全面讲解,涵盖了事务的核心概念、操作示例、失败回滚、隔离级别、事务性 DDL 和 XA 事务等内容,并修正了查看隔离级别的命令。 MySQL 8.0 事务全面讲解 一、事务的核心概念(ACID) 事务是…...