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ÿ…...
MODBUS TCP转CANopen 技术赋能高效协同作业
在现代工业自动化领域,MODBUS TCP和CANopen两种通讯协议因其稳定性和高效性被广泛应用于各种设备和系统中。而随着科技的不断进步,这两种通讯协议也正在被逐步融合,形成了一种新型的通讯方式——开疆智能MODBUS TCP转CANopen网关KJ-TCPC-CANP…...
【JavaWeb】Docker项目部署
引言 之前学习了Linux操作系统的常见命令,在Linux上安装软件,以及如何在Linux上部署一个单体项目,大多数同学都会有相同的感受,那就是麻烦。 核心体现在三点: 命令太多了,记不住 软件安装包名字复杂&…...
OPENCV形态学基础之二腐蚀
一.腐蚀的原理 (图1) 数学表达式:dst(x,y) erode(src(x,y)) min(x,y)src(xx,yy) 腐蚀也是图像形态学的基本功能之一,腐蚀跟膨胀属于反向操作,膨胀是把图像图像变大,而腐蚀就是把图像变小。腐蚀后的图像变小变暗淡。 腐蚀…...
安卓基础(aar)
重新设置java21的环境,临时设置 $env:JAVA_HOME "D:\Android Studio\jbr" 查看当前环境变量 JAVA_HOME 的值 echo $env:JAVA_HOME 构建ARR文件 ./gradlew :private-lib:assembleRelease 目录是这样的: MyApp/ ├── app/ …...
MySQL 8.0 事务全面讲解
以下是一个结合两次回答的 MySQL 8.0 事务全面讲解,涵盖了事务的核心概念、操作示例、失败回滚、隔离级别、事务性 DDL 和 XA 事务等内容,并修正了查看隔离级别的命令。 MySQL 8.0 事务全面讲解 一、事务的核心概念(ACID) 事务是…...
脑机新手指南(七):OpenBCI_GUI:从环境搭建到数据可视化(上)
一、OpenBCI_GUI 项目概述 (一)项目背景与目标 OpenBCI 是一个开源的脑电信号采集硬件平台,其配套的 OpenBCI_GUI 则是专为该硬件设计的图形化界面工具。对于研究人员、开发者和学生而言,首次接触 OpenBCI 设备时,往…...
手机平板能效生态设计指令EU 2023/1670标准解读
手机平板能效生态设计指令EU 2023/1670标准解读 以下是针对欧盟《手机和平板电脑生态设计法规》(EU) 2023/1670 的核心解读,综合法规核心要求、最新修正及企业合规要点: 一、法规背景与目标 生效与强制时间 发布于2023年8月31日(OJ公报&…...
GraphQL 实战篇:Apollo Client 配置与缓存
GraphQL 实战篇:Apollo Client 配置与缓存 上一篇:GraphQL 入门篇:基础查询语法 依旧和上一篇的笔记一样,主实操,没啥过多的细节讲解,代码具体在: https://github.com/GoldenaArcher/graphql…...
在 Visual Studio Code 中使用驭码 CodeRider 提升开发效率:以冒泡排序为例
目录 前言1 插件安装与配置1.1 安装驭码 CodeRider1.2 初始配置建议 2 示例代码:冒泡排序3 驭码 CodeRider 功能详解3.1 功能概览3.2 代码解释功能3.3 自动注释生成3.4 逻辑修改功能3.5 单元测试自动生成3.6 代码优化建议 4 驭码的实际应用建议5 常见问题与解决建议…...
用递归算法解锁「子集」问题 —— LeetCode 78题解析
文章目录 一、题目介绍二、递归思路详解:从决策树开始理解三、解法一:二叉决策树 DFS四、解法二:组合式回溯写法(推荐)五、解法对比 递归算法是编程中一种非常强大且常见的思想,它能够优雅地解决很多复杂的…...
