linux--信号

【Qt笔记】1.VSCode搭建Qt运行环境 Qt6之后已经抛弃qmake,使用cmake。cmake相对qmake来说只有优点没有缺点。使用VSCode搭建完Qt的运行环境就能开开心心debug了.vscode需要使用的插件:2.Qt tools3.CMakec++插件可以不关注,缺啥都会提醒你.正常安装即可。 阅读详情

信号概念

信号是用于通知发生某些事件,然后打断进程当前操作,改去处理该发生事件的进程间通信方式之一
信号实质是进程PCB(task_struct)中的一个位图表,其中包含两个位图和一个函数指针:阻塞位图(blocked),未决位图(pending),信号递达函数指针(handler)
信号也是软件中断的方式之一

查看信号列表命令:kill -l
信号格式:编号 + 宏定义名称
信号的总数:62个
信号分类:
1.非可靠信号(非实时信号):继承于unix,每一个信号都对应一个固定的事件;总共有31个,编号由1–31;当某个信号已经被注册了之后,再次出现该信号,则直接丢弃该信号,不对其进行注册。
2.可靠信号(实时信号):总共31个,编号由34–64;不管该信号有没有被注册过,都不会丢弃信号。

中断
概念:打断当前操作,并且去处理该打断事件的过程
分类: 硬件中断、软件中断

信号生命周期:
信号产生–>信号注册–>(信号阻塞/屏蔽)–>信号注销–>信号处理(递达)

注:信号的阻塞/屏蔽不一定在信号生命周期当中
图分析:
在这里插入图片描述

信号产生

产生方式:
1.硬件中断:如CTRL+C,表示对该进程发送2号信号SIGINT…

2.硬件异常:如非法内存访问…

3.命令产生:kill + 信号编号g + 进程id,表示对id进程发送信号g

4.系统函数产生:
(a):kill函数:int kill(int pid, int signo);
对任意进程发送任意信号
signo:表示信号编号,一般有信号的宏定义名称
成功返回0,失败-1。

(b):raise函数:int raise(int signo);
进程对自己发送任意信号

( c):sigqueue函数:int sigqueue(int pid, int signo, union sigval value);
比kill函数多带一个参数

(d):abort函数:void abort(void);
对自己发送一个abort信号
该函数一定成功,所以没有返回值

(e):alarm接口调用:int alarm(unsigned int second);
对自己设置一个闹钟,即second秒之后,对自己发送一个alarm信号;第二个闹钟会 覆盖 第一个闹钟。
若second参数为0,则表示取消闹钟设置
返回值:返回上一个闹钟还剩余的秒数或0

信号产生代码测试:https://gitee.com/free_xin/codes/jeougyq13al7phkz89tsd14

信号注册:

概念:在进程PCB(task_struct)中的pending表中记录收到的信号
pending表(未决)
概念:信号在内核中注册的位置;
非可靠信号: 当进程收到一个信号时,在进程PCB中的pending表中记录该信号结点,并且对应该信号的位图置1,当再次收到该信号时,直接丢弃。
可靠信号: 和非可靠信号不同的是,再次收到该信号时,会将该结点链接到原来的信号结点之后

注:该信号结点采用的是sigset_t数据结构(信号集)

信号阻塞/屏蔽

blocked表(阻塞)
概念:默认该表中对应的信号都是非阻塞,当收到要阻塞信号的命令时,会将对应该信号的比特位置1。
采用的是sigset_t数据结构(信号集)
设置/解除阻塞信号:
1.步骤:
定义阻塞信号集(屏蔽字)–>初始化(清空)信号集–>添加要阻塞/解除阻塞的信号–>设置屏蔽/解除阻塞

清空信号集函数: int sigemptyset(sigset_t set);
表示将所有比特位清零,表示该信号集不包含任何有效信号。

添加信号函数:int sigadddset(sigset_t set, int signo);

设置屏蔽函数:int sigprocmask(int how, const sigset_t set, const sigset_t oset);
how:要对新的信号集执行的操作;SIG_BLOCK:设置屏蔽/阻塞;SIG_UNBLOCK:设置非阻塞/解除阻塞
set:要设置的新的信号集
oset:将老的信号集拿出保存

其他信号集函数:
填充信号集函数:int sigfillset(sigset_t *set);
表示将用系统中支持的所有信号填充该信号集。 也可以用于初始化
删除信号集中某个信号函数:int sigdelset(sigset_t *set, int signo);
判定某个信号是否在该信号集中:int sigismember(const sigset_t *set, int signo);
只有该函数为布尔函数,存在返回1,不存在返回0,出错返回-1;其他函数均成功返回0,失败返回-1。

获取当前进程的未决信号集:int sigpending(sigset_t set);
set: 作为输出型参数,用于获取该进程的未决信号集
成功返回0,失败返回-1。

信号阻塞测试代码:https://gitee.com/free_xin/codes/p9uwxdjz8f2im5e3yhl6s69

信号注销

概念:在pending表中将已经递达的信号移除
对于非可靠信号:将信号结点移除,将对应位图置0
对于可靠信号:将该信号结点移除,查看是否还存在与该信号相同的信号结点;若有,则不处理位图;若无,则将对应位图置0

信号处理(递达)(捕捉)

条件:当进程从内核态回到用户态时,检查pending表中是否有未递达的信号,然后在blocked表中查看该信号是否被阻塞,若存在没有被阻塞的未递达的信号,则对该信号进行递达处理。
信号处理方式:
1.忽略:直接将该信号注销
2.默认处理方式:执行系统定义好的对应该信号的处理方式
3.自定义处理方式:自己定义处理方式

信号处理(递达)函数:
1.sighandler_t signal(int signo, sighandler_t handler);
signo:要处理的信号的宏定义名称
handler:要对该信号进行的处理方式
a).SIG_IGN:忽略处理
b).SIG_DFL:默认处理
c).自己定义的处理方式的函数名

成功返回0,失败返回-1
2.int sigaction(int signo, const struct sigaction act, struct sigaction oact);
signo:要处理的信号的宏定义名称
act:是sigaction结构体,表示对该信号的要执行什么处理操作;
oact:sigaction结构体,记录原来对该信号的处理操作

成功返回0,失败返回-1.

sigaction结构体解析:
在这里插入图片描述
3.int pause(void);
作用:使进程挂起等待,直到有信号递达
返回值:若信号递达动作是进程终止,则该进程终止,无返回值;若信号递达动作是忽略,则该进程继续挂起等待,无返回值;若信号递达动作为自定义函数,则执行自定义函数之后返回-1,;失败也返回-1;

信号捕捉示意图:
在这里插入图片描述

信号是我认为Linux中很难的部分,关于信号集(sigset_t)结构体、以及三张位图表的内容一直没搞懂,希望以后能搞懂一下…

希望有大佬可以指教指教我。。。
在这里插入图片描述

机器人C++开源库The Robotics Library (RL)使用手册(三) 进入VS工程,我们先看看这些功能函数及其依赖库的分布关系:rl命名空间下,主要有八大模块。搞定VS后将逐个拆解。 阅读详情

相关推荐

Ansys Zemax | 公差分析中的补偿器优化:如何提升系统良率?

本文深入探讨了在Ansys Zemax公差分析中如何有效设置与优化补偿器以提升系统良率。文章指出,补偿器是连接理想设计与现实生产的关键,通过模拟实际装配中的调整(如后焦距),能显著改善公差分析的“悲观”预测。详细介绍了补偿器的添加方法、多补偿器策略、评价函数设计以及通过灵敏度分析和蒙特卡洛档案优化补偿效果,旨在帮助光学工程师制定更符合生产实际的公差策略,从而有效提升产品良率。

weixin_28419039的博客 621

Linux12 信号

ctrul+c(命令)——>发送信号//用信号代表这件事情产生了中断(软中断)//信号打断了进程当某个进程正在执行时,用户在终端键盘上按下某些键时,此时会产生一个硬件中断。此时终端驱动程序会将其解释为某一种信号,操作系统得知后会将该信号发送个正在前台运行的进程。并在合适的时机去处理该信号大部分信号的产生都是因为进程产生了异常只有信号才能把进程终止信号自定义signal(),将信号改变成自定义的信号,当调用signal时,内核收到信号,直接调用相应的方法忽略SIG_IGN。

zyq2217330101的博客 278

集成学习综述—bagging/随机森林/adaboost/GBDT/XGBoost/LightGBM/catboost 原理和代码介绍

集成学习介绍 文章目录集成学习介绍1 基本概念1.1 定义基本定义集成学习类别参考链接1.2 基学习器(CART)介绍公式介绍例子讲解代码实践参考链接1.3 偏差(bias)和方差(var)公式推导图解参考链接2 Boosting类2.1 原理2.2 AdaBoost2.2.2 公式推导2.2.3 优点与不足优点不足应用2.2.4 代码实践2.2.5 参考链接2.3 GBDT原理介绍代码实践参考...

fzl的博客 4616

Linux应用编程---12.信号

​ 信号用于内核层与应用层、应用层与应用层之间传递控制指令。Linux下有64种信号类型。使用signal()函数可以改写信号的作用,但有的信号不支持。kill()函数可以向一个进程发送某个信号。

shiyuanxuan369的博客 367

28-基于STM32单片机的便携式健康监测系统设计与实现(程序+原理图+元件清单)

本文详细介绍了基于STM32单片机的便携式健康监测系统设计与实现,该系统集成MAX30102光电传感器和MSP20压力传感器,实时监测心率、血氧和血压等关键生理指标。通过STM32F103C8T6主控芯片和HC-05蓝牙模块,实现数据采集、处理及无线传输,具有便携性高、操作简便等特点,适用于家庭健康监护和户外运动场景。

weixin_29191669的博客 420

【ESP32实战】SPI驱动ILI9341屏幕:从基础绘图到汉字显示

本文详细介绍了如何使用ESP32通过SPI驱动ILI9341屏幕,从基础连接、SPI初始化到实现基础绘图、数字显示及汉字显示的全过程。文章包含实用的代码示例和优化技巧,帮助开发者快速掌握屏幕驱动技术,提升显示性能。特别针对常见问题如花屏、刷新率等提供了解决方案。

weixin_29164091的博客 621

Linux系统编程——信号

一、

qq_37233070的博客 1556

无需SLAM建图,直接生成Gazebo仿真环境的二维代价地图的功能包pgm_map_creator适配ROS Noetic编译报错及解决方法

在ROS Noetic中,使用`pgm_map_creator`功能包直接生成Gazebo仿真环境的二维代价地图时,可能会遇到各种编译和运行错误。本篇博客详细解析了在适配ROS Noetic过程中常见的报错及其解决方法,包括Boost文件结构更新、C++版本兼容性、Gazebo函数名变更、链接库缺失以及protobuf文件加载错误。通过逐步排查和修改,如更换头文件路径、调整C++标准、更新CMakeLists.txt文件等,成功解决了这些问题,使得`pgm_map_creator`功能包能够顺利编译和运行。

慕羽★的博客 2261

Linux信号基本概念

利用bash创建ps命令------execl的使用(结合fork) fork+exec()是Linux上创建新进程方式 #include<stdio.h> #include<stdlib.h> #include<unistd.h> #include<assert.h> #include<sys/wait.h> int main() { printf("main pid=%d,ppid=%d\n",getpid(),getppid(

weixin_59179454的博客 567

国债期货的日线趋势跟踪策略实现(基于backtrader框架)

通过backtrader框架,我们可以轻松地实现国债期货的日线趋势跟踪策略,并进行回测和验证。通过这种策略,我们可以尝试捕捉国债期货价格的短期趋势,并根据趋势的方向进行交易决策。backtrader提供了许多内置的指标、订单类型和其他功能,可以帮助你进一步优化和改进你的策略。它提供了丰富的工具和功能,使我们能够快速实现和验证我们的交易想法。方法中,我们根据当前价格和前一天的价格判断趋势的方向,并根据趋势的变化进行买入或卖出操作。然后,我们设置了初始资金和交易手续费,并将我们定义的策略。来跟踪每日的收盘价。

NisyPhilosophy的博客 404

深入解析雪球网股票行情数据爬取:基于WebSocket与API的实时数据获取技术实践

本文详细介绍了如何使用Python爬虫技术获取雪球网的股票行情数据,涵盖了WebSocket实时数据连接和RESTful API接口调用两种主要技术方案。完整的WebSocket客户端,支持实时行情订阅和数据处理功能丰富的API客户端,支持多种数据类型的获取数据存储和管理系统,使用SQLite进行数据持久化实时监控和预警系统,支持自定义预警规则技术指标计算,提供基本的数据分析功能。

2201_76125261的博客 1255

12.linux中的信号

12.1.什么是信号 12.2.常见信号介绍 12.3.进程对信号的处理 12.4.alarm和pause函数

Rston's Notes 821

相位编码脉冲压缩信号的理论研究与 Matlab 实现

通过实际的代码示例,我们展示了如何生成信号、进行相位编码、传输信号、相位解码和脉冲压缩的步骤。相位编码脉冲压缩信号是通过在发射端对信号进行相位编码,并在接收端对信号进行相位解码来实现的。其主要原理是在发射端将信号的频率进行调制,使得信号具有宽带特性,然后在接收端通过匹配滤波器对信号进行解调和压缩,从而提高信号的分辨率和抗干扰能力。相位编码脉冲压缩信号是一种在信号处理中常用的技术,用于提高信号的分辨率和抗干扰能力。可以使用 Matlab 中的信号生成函数生成一个宽带脉冲信号,例如矩形脉冲信号或高斯脉冲信号。

CyberWizarDD的博客 903

【Linux】信号

Linux信号

qq_48460693的博客 1626

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

[ Linux ] Linux信号概述 信号的产生

[ Linux ] Linux信号概述 信号的产生

优快云博客 2991

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

Linux——信号

本文介绍了Linux系统中的信号机制,包括信号的基本概念、产生方式、保存方式以及处理方式。信号是一种异步事件通知机制,进程可以通过默认处理、自定义处理或忽略来处理信号。信号的产生方式包括键盘输入、系统调用、指令、硬件异常和软件条件。信号在进程中被保存在block(阻塞状态)、pending(未决状态)和handler(处理方法)三张表中。文章还详细讲解了信号集操作函数和信号屏蔽字的设置方法,并通过代码示例演示了信号的捕获、阻塞和pending表的查看。

二哈的博客 1309

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

Linux 信号

信号产生后,默认处理动作有TermIgnCoreStepContTrem:终止进程。Ign:忽略这个信号。Core:终止进程并进行核心转储(Core Dump)。Step:暂停进程。Cont:让暂停的进程继续执行。大部分信号的默认处理动作是Trem和Core普通的终止进程不会做别的事情。core:除了终止进程,还会进行核心转储core dump),生成core文件,core文件中存储的是程序出错的相关信息,有助于找出问题所在。核心转储功能默认是关闭的(可使用。

qq_74190188的博客 1328

linux之信号

信号是由用户、系统或者进程发送给目标进程的信息,以通知目标进程某个状态的改变或系统异常。

Happinesspills 3530

Linux 信号总结以及常见信号使用

【摘要】信号是学习 linux 时必须要熟悉的一部分,没有了信号 Linux 系统就没办法正常的工作。而我们作为 Linux 程序员,也要用到信号来进行程序的运行,没有了信号,我们的工作将会变得一团糟。这几天,我把刚刚学的关于信号的知识点总结了一下,分享给大家,希望可以对大家有所帮助。 信号的概念 信号是 linux 系统为了响应某些状况而产生的事件。进程收到信号后应该采取相应的动作 哪些情况会引...

ruglcc's blog 2501

17 Linux进程信号_linux 信号17

信号产生之后,不是立即被处理的:信号从产生到处理的过程中是有时间窗口的,在这个时间窗口之内信号是要排队的,所谓的排队是将这个信号记录或保存下来。

2401_89173779的博客 929

linux信号

信号的概念信号是 Linux 进程间通信的最古老的方式。信号是软件中断,它是在软件层次上对中断机制的一种模拟,是一种异步通信的方式。信号可以导致一个正在运行的进程被另一个正在运行的异步进程中断,转而处理某一个突发事件。“中断”在我们生活中经常遇到,譬如,我正在房间里打游戏,突然送快递的来了,把正在玩游戏的我给“中断”了,我去签收快递( 处理中断 ),处理完成后,再继续玩我的游戏。这里我们学习的“信号”就是属于这么一种“中断”。

qq_44729609的博客 891

Linux信号

信号时Linux系统提供的一种让用户(进程)之间发送异步信息的方式。用户输入命令,在Shell下启动一个前台进程。用户按下Ctrl-C,,这个键盘输入产生一个硬件中断,被OS获取,解释成信号,发送给目标前台进程,前台进程因为收到信号,进而引起进程退出一个命令后面加个&可以放到后台运行,Shell可以同时运行一个前台进程和任意多个后台进程,只有前台进程才能接到像 Ctrl-C 这种控制键产生的信号。

xwy13886467077的博客 1241
上一篇: volatile关键字
下一篇: 线程基本概念
Code_zx
博客等级 码龄9年 83粉丝 38原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值