信号收尾.

2023-11-30 13:52
文章标签 信号 收尾

本文主要是介绍信号收尾.,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

sigaction 信号捕捉

它也是信号捕捉,不仅能处理普通信号还能处理实时信号,但我们不管实时信号
在这里插入图片描述
我们发现函数名和形参中结构体名一样都是sigaction,这在c/c++中允许吗?
不建议,但是可以

signo你要捕捉几号信号
输入型参数act结构体里面包含了你要设置新的动作,输出型参数oact是保存老的设置以便你后续恢复
看看sigaction结构体里面,红线是我们不关心的,里面有个sa_handler不就是之前信号捕捉的函数指针类型吗,也就是处理方法,其实也就是修改了handler表里面的方法
在这里插入图片描述
这个结构体红线你都不关心,那直接用memset都清零就可以

问题
1、结构体中sa_mask什么鬼?

2、如果要处理一个信号了,进程的pending位图里面对应信号是1,这个1是在信号处理前清零还是信号处理后清零?
你都能捕捉了,你在捕捉里面打印看看Pending表就知道了,如果信号处理方法中打印出来2号信号是0那么说明在信号处理前pending中信号就已经被清零了
在这里插入图片描述

在这里插入图片描述
所以结论:pending位图,什么时候从1->0. 执行信号捕捉方法之前,先清0,在调用

一个事实:当某个信号的处理函数被调用时,内核自动将当前信号加入进程的信号屏蔽字,当信号处理函数返回时自动恢复原来
的信号屏蔽字,这样就保证了在处理某个信号时,如果这种信号再次产生,那么 它会被阻塞到当前处理结束为止
也就说不允许同一个信号不断向我的进程发,让我进程不断忙于各种信号处理

如果没有这个事实的话
在信号捕捉方法中,也就是自定义动作函数中:
1.函数中可以陷入内核,因为函数中会被调度 或者 系统调用,而且这很正常我调个printf访问硬件你不给我系统调用吗
2.如果再来一个2号信号,这是可以的因为你处理前就把pending表2号由1变0,所以正在处理2号信号还能再接收2号信号
所以此时很尴尬我们正在对2号进行捕捉,又来一个2号信号,又陷入方法函数中继续再进行捕捉
相当于对handler方法不断的重复调用,如果一直这么调用那连信号捕捉我还返回不了了!
OS不允许你这么干。

那怎么证明信号捕捉时,2号信号确实是被屏蔽了呢?
我们让捕捉函数中死循环打印pending表,一直处理2号信号,此时我们在发送一次2号信号,如果被屏蔽就会看到2号信号由0置1
在这里插入图片描述
证明完成
所以OS不允许对同一种信号进行不断嵌套式的捕捉,它的捕捉层数只能是一层,任何一个信号都是如此

所以struct sigaction结构体中sa_mask是干什么的呢?
如果在调用信号处理函数时,除了当前信号被自动屏蔽之外,还希望自动屏蔽另外一些信号,则用sa_mask字段说明这些需
要额外屏蔽的信号,当信号处理函数返回时自动恢复原来的信号屏蔽字。
在这里插入图片描述

正在处理2号信号期间只有2号会被自动屏蔽。
如果我还想屏蔽更多信号呢?? ?那就利用这个sa_mask设置
在这里插入图片描述

在这里插入图片描述

最后说一下
所以处理一个信号期间,如果我再收到10个同样的信号,最终这个信号只会被记录一次,因为只有一个pending位图哦
在这里插入图片描述

在这里插入图片描述

这篇关于信号收尾.的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/437276

相关文章

无线路由器哪个品牌好用信号强? 口碑最好的三个路由器大比拼

《无线路由器哪个品牌好用信号强?口碑最好的三个路由器大比拼》不同品牌在信号覆盖、稳定性和易用性等方面各有特色,如何在众多选择中找到最适合自己的那款无线路由器呢?今天推荐三款路由器让你的网速起飞... 今天我们来聊聊那些让网速飞起来的路由器。在这个信息爆炸的时代,一个好路由器简直就是家庭网编程络的心脏。无论你

电脑显示hdmi无信号怎么办? 电脑显示器无信号的终极解决指南

《电脑显示hdmi无信号怎么办?电脑显示器无信号的终极解决指南》HDMI无信号的问题却让人头疼不已,遇到这种情况该怎么办?针对这种情况,我们可以采取一系列步骤来逐一排查并解决问题,以下是详细的方法... 无论你是试图为笔记本电脑设置多个显示器还是使用外部显示器,都可能会弹出“无HDMI信号”错误。此消息可能

列举你能想到的UNIX信号,并说明信号用途

信号是一种软中断,是一种处理异步事件的方法。一般来说,操作系统都支持许多信号。尤其是UNIX,比较重要应用程序一般都会处理信号。 UNIX定义了许多信号,比如SIGINT表示中断字符信号,也就是Ctrl+C的信号,SIGBUS表示硬件故障的信号;SIGCHLD表示子进程状态改变信号;SIGKILL表示终止程序运行的信号,等等。信号量编程是UNIX下非常重要的一种技术。 Unix信号量也可以

Linux中如何屏蔽信号

本篇文章主要学习Linux的信号处理机制,着重学习屏蔽信号部分。屏蔽信号处理的两种方式类似于信号的捕获,一种方式是直接对其设置,另一种方式是先获得描述符的掩码,然后对其设置操作。 本文主要参考自《嵌入式linux系统使用开发》,作者何永琪,Thanks. 在linux系统中,如何处理某个进程发送的一个特定信号呢?一般来说有三种方式: 1) 忽略信号 2) 屏蔽信号 3) 为该信号添

信号与信号量的区别[转]

信号量(Semaphore),有时被称为信号灯,是在多环境下使用的一种设施,是可以用来保证两个或多个关键代码段不被并发调用。在进入一个关键代码段之前,线程必须获取一个信号量;一旦该关键代码段完成了,那么该线程必须释放信号量。其它想进入该关键代码段的线程必须等待直到第一个线程释放信号量。为了完成这个过程,需要创建一个信号量VI,然后将Acquire Semaphore VI以及Release Se

国产隔离放大器:增强信号完整性和系统安全性的指南

隔离放大器是电子领域的关键组件,特别是在信号完整性和电气隔离至关重要的应用中。这些放大器隔离输入和输出信号,使它们能够在没有直接电气连接的情况下跨不同系统传输数据。这确保了电路一部分的高压尖峰或噪声不会影响另一部分,从而保护了系统和用户。随着国产隔离放大器的不断发展,它们提供了性能、可靠性和成本效益的完美结合,使其成为工程师和系统设计师的理想选择。 1. 了解国产隔离放大器的优势 增强信号

信号有效带宽

根据傅里叶变换可以知道信号带宽是无穷大的,这对实际应用是帮助不大的,所以有了有效带宽的概念,可能大家知道常用的经验公式:O.35/Tr或者0.5/Tr等,那这个公式是怎么来的呢?有效带宽又是什么含义呢? 首先来看一个RC低通滤波器,如下: 其上升时间Tr为: 该滤波器的传递函数为: H(s)=1/(RCS+1) 式中S=2πf,转换为频率f的函数为: H(f)=1/(R

Linux 一个简单的中断信号实现

1.查看手册,学习中断处理图 流程:(次级源->开关)到 源挂起 到 开关  到 处理优先级 到 中断挂起标志 到 CPSR里面的开关(图中未展现) 最后cpu处理 此次我们先使用k1按键实现中断,即是eint8 2.此次仅涉及一个中断挂起,步骤较简单,有的寄存器未涉及处理。 寄存器挂起后,通过写1清除对应位( 硬件设计逻辑: 中断标志位通常由硬件自动设置为 1,表示中断发生。

【QT】十分钟全面理解 信号与槽的机制

目录 从一个定时器开始全方位简介1. 基本的信号与槽连接语法例子 2. 使用函数指针连接信号与槽(现代 C++ 风格)语法例子 3. 使用 Lambda 表达式作为槽语法例子 4. 自动连接(`QMetaObject::connectSlotsByName`)规则例子 5. 信号与槽的多对多连接例子(一个信号连接多个槽)例子(多个信号连接一个槽) 6. 断开信号与槽的连接语法例子 7. 信号

RS485差分信号不对称

在RS485总线通信中,差分信号不对称的问题时常出现,尤其是在总线未接从机设备的情况下。这一问题不仅影响通信质量,还可能导致信号传输错误。通过对实际波形、芯片手册及电路的深入分析,可以找出引发差分信号不对称的根本原因,并采取相应的解决措施。 问题描述 在RS485通信测试中,当总线上没有从机设备连接时,观察到RS485差分信号(A、B)关于地(GND)不对称。理想情况下,RS485的差分信