捕捉信号

信号捕捉与处理:信号捕捉的过程 + 信号处理函数(signal、sigaction) 从内核的角度分析信号捕捉的过程,以及了解信号处理函数,并对信号从发送到被处理所经历的过程做一个总结 阅读详情

之前我们知道,操作系统会在合适的时候对接收到的信号做出相应的处理。
那么现在我们知道这个合适的时候就是:进程从内核态返回到用户态,会检查信号,并作出相应的处理。
下面我们来详细的说下这到底是怎么回事?
1、当我们在执行我们所写的一个程序的时候,可能会因为中断、异常或者系统调用从而进入内核。
2、进入内核,内核会处理这些问题,处理完以后内核会返回到用户态,然而在返回之前,内核做的最后一件事情就是处理当前进程中可以抵达的信号。
3、若处理动作是用户自定义的处理函数,则会回到用户态执行该信号处理函数(不是一开始产生异常情况就进入内核的地方)也就是主控制流程。
4、信号处理函数返回时执行特殊的系统调用sigreturn再次进入内核。
5、返回用户模式从主控制流程中上次被中断的地方继续向下执行。
这里写图片描述

一、内核如何实现信号的捕捉?

如果信号的处理动作是用户自定义的函数,在信号抵达时就调用这个函数,这称为捕捉信号。由于信号处理函数的代码是在用户空间的,处理过程比较复杂。举例:用户程序注册了SIGQUIT信号的处理函数sighandler,当前正在执行main函数,这时发生中断或异常切换到内核态。在中断处理完毕后要返回用户态的main函数之前检查有信号SIGQUIT抵达。内核决定返回用户态后不是恢复main函数的上下文继续执行,而是执行sighandler函数,**sjghandler函数和main函数使用不同的堆栈空间,它们之间的关系不存在调用和被调用的关系,是两个独立的控制流程。**sjghandler函数返回后自动执行特殊的系统调用sigreturn再次进入内核态。如果没有新的信号要抵达,这次再返回用户态就是恢复main函数的上下文数据继续执行了。
sigaction函数
读取和修改与指定信号相关联的处理动作,成功返回0,出错返回-1
这里写图片描述

signore:指定信号的编号
act指针非空:根据act 修改该信号的处理动作
oact指针非空:通过oact传出该信号原来的处理动作
act和oact指向sigaction结构体,将sa_handler赋值为常数SIGINT传给sigaction表示忽略信号,赋值为常数SIG_DFL表示执行默认动作,赋值为一个函数指针表示用自定义函数捕捉信号或者说向内核注册了一个信号处理函数。

pause函数

pause函数使调用进程挂起直到有信号抵达(在这里的挂起的含义:挂起相当于T状态;就相当于从运行队列转到暂停队列)pause只有出错的返回值

这里写图片描述
如果信号的处理动作是终止进程,则进程终止,pause函数没有机会返回;如果信号的处理动作是忽略,则进程继续处于挂起状态,pause不返回;如果信号的处理动作是捕捉,则调用了信号处理函数之后,pause返回-1,errno设置为EINTR.错误码ERRTR表示“被信号中断”。

二、下面我们将用alarm和pause实现mysleep

main函数调用mysleep函数,mysleep函数调用sigaction注册了SIGALRM信号的处理函数sig_alrm。
2、调用alarm(nsecs)设定闹钟。
3、调用pause等待,内核切换到别的进程运行。
4、nsecs秒之后,闹钟超时,内核发SIGALRM信号给这个进程
5、从内核态返回这个进程的用户态之前处理未决信号,发现有SIGALRM信号,其处理函数是sig_alrm.
6切换到用户态执行sig_alrm函数,混入sig_alrm函数时SIGALRM信号被自动屏蔽,从sia_alrm函数返回时SIGALRM信号自动解除屏蔽,然后自动的执行系统调用sigreturn再次进入内核,再次进入内核,再返回用户态继续执行进程的主控制流程(main函数调用mysleep函数)。
7、pause函数返回-1,然后调用alarm(0)取消闹钟,调用sigaction恢复SIGALRM信号以前的处理动作。
代码实现如下:

1 #include <stdio.h>
  2 #include <signal.h>
  3 #include <unistd.h>
  4 
  5 void sig_alrm(int signo)
  6 {
  7     //这里的信号处理函数不许要干啥事情
  8     //注册它是为了捕捉信号,从而pause返回
  9 }
 10 unsigned int mysleep(unsigned int nsecs)
 11 {
 12     struct sigaction new,old;
 13     unsigned int unslept=0;
 14     new.sa_handler=sig_alrm;
 15     sigemptyset(&new.sa_mask);
 16     new.sa_flags=0;
 17     //注册信号处理函数
 18     sigaction(SIGALRM,&new,&old);
 19     //设置闹钟
 20     alarm(nsecs);
 21     pause();
 22     //清空闹钟
 23     unslept=alarm(0);
 24     //恢复默认信号处理动作
 25     sigaction(SIGALRM,&old,NULL);
 26     //返回0说明休眠时间够
 27     //非0说明没到规定时间
 28     return unslept;
 29 }
 30 int main()
 31 {
 32     while(1)
 33     {
 34         mysleep(3);
 35         printf("3 seconds passed\n");
 36     }
 37     return 0;
 38 }
 39                                                                                                                                                                                                            
~                        

注意:信号处理函数sig_alrm什么都没干,为什么还要注册它作为SIGALRM的处理函数?不注册信号处理函数可以吗?(SIGALRM会终止进程?)
pause函数只有遇到用户自定义的信号捕捉函数时才会返回。所以为了让sig_alrm函数返回才定义的catch()函数。
为什么在my_sleep函数返回前要恢复SIGALRM信号原来的sigaction?
不恢复也可以,但是我们要遵守一定的规则,即不要改变函数原先的行为,所以就要恢复它本来的行为。这样也方便我们再次调用时把握它的处理方式。
my_sleep函数的返回值表示什么含义?什么情况下返回非0值?
返回0表示取消闹钟,已经唤醒成功。如果在闹钟还没响时就取消闹钟,返回值表示还有多久闹钟才会响。

从零到一:Silvaco中跨导曲线的自动化脚本实现 本文详细介绍了如何使用Python脚本在Silvaco中实现跨导曲线(gm曲线)的自动化分析,包括数据加载、跨导计算和结果可视化。通过自动化处理Id-Vg曲线,显著提升半导体器件工程师的工作效率,特别适用于工艺优化和DOE分析。文章还提供了批量处理和关键参数提取的高级技巧,帮助工程师快速掌握Silvaco脚本开发。 阅读详情

相关推荐

Skynet 框架面试题

本文整理了游戏服务端开发面试中 Skynet 框架的高频考点,涵盖底层架构、消息派发、协程调度、网络 I/O、harbor 跨机通信、内存管理、socket 处理、阻塞操作、错误处理等核心内容。全面覆盖 Skynet 框架的原理、使用和实战问题,追求深入准确,拒绝八股文。

小赖的博客 383

【Linux信号专题】四、信号的捕捉

Linux信号专题——四、信号的捕捉。系统学习Linux开发、VIM/GCC/GDB/Make工具、Linux文件IO、进程管理、进程通信、多线程等,请关注专栏《Linux从小白到大神》免费学习。

仅以此博客记录日常学习工作中所思所得,水平有限,难登大雅,万望海涵。 1868

用Arduino和RC522模块DIY一个NFC门禁卡复制器(附完整代码)

本文详细介绍了如何利用Arduino和RC522模块DIY一个NFC门禁卡复制器,包括硬件连接、软件配置、数据读写技术及完整代码实现。通过本教程,电子爱好者可以深入了解NFC技术,并构建自己的智能门禁系统,适用于家庭安全、办公场所等多种场景。

weixin_33704591的博客 502

GPS信号捕获基本原理

GPS卫星发送的信号一般由3个分量组成:载波、伪码和导航电文,其中伪码和导航电文采用BPSK技术去调制载波。 GPS使用的两个L波段两种载频: 1 GPS搜索捕获原理 为了跟踪和解码GPS信号,首先要捕获到GPS信号。将捕获到的GPS信号的数据传递给跟踪过程,再通过跟踪过程便可得到卫星的导航电文。传统的GPS捕获方法有:串行搜索捕获、滑动相关法、循环相关法、PMF算法。 1.1串行搜索捕获方式 串行搜索在同一搜索时间内仅完成对一个可能区间的搜索。设置本地扩频序列的定时初相,本地生成的序列与输入

FPGA/MATLAB学习教程/源码/项目合作开发 1万+

macOS 12.7.6部署Ollama+Dify避坑指南

本文介绍了在macOS 12.7.6系统下部署Ollama和Dify的详细步骤及避坑指南。主要内容包括:1)关闭系统完整性保护(SIP)以允许修改系统目录;2)安装特定版本的Docker(2.1.0.5)和docker-compose(v2.38.2)以避免兼容性问题;3)配置Ollama服务并下载nomic-embed-text和deepseek-r1:7b模型;4)针对macOS调整Dify的docker配置文件,包括延长超时时间、修改存储路径、增加资源限制等关键设置。文中提供了完整的命令操作步骤和配置

Hi20240217的博客 3103

AMBA-CHI协议详解(七)

本节描述该协议包含的支持系统保序需求的机制。

Crazzy_M的博客 1158

信号的捕捉及使用

title: 信号的捕捉及使用 date: 2019-08-05 09:01:44 tags: Linux categories: Linux         1、信号的安装         如果进程要处理某一信号,那么就要在进程中安装该信号。安装信号作用是确定进程针对该信号值的动作之间的映射关系,即进程将要处理哪个信号;该信号被传递给进程时,将执行何种操作。 2、信号的捕捉 函数原型 #include <s.

菜鸟的博客 736

openssl命令数据摘要详解(SM3、sha256、MD5、dss1、mdc2、ripemd160)

SM3是由中国密码学家设计的密码哈希函数,是中国国家密码管理局(National Cryptographic Authority,简称:CNCA)颁布的国家密码算法标准。SM3属于密码杂凑函数家族,它可以计算任意长度的消息并生成固定长度(256比特,即32字节)的哈希值。SM3生成的哈希值长度为256比特(32字节),不管输入消息的长度如何,输出始终是固定的。SM3将输入数据划分为512比特(64字节)的分组,并对每个分组进行处理。

N阶二进制的博客 4460

系统级基础信号知识【Linux】【信号产生,捕捉,原理】

操作系统中的信号是一种在进程间传递信息和通知的机制。它可以用来通知进程发生了某种事件,比如用户按下了某个键盘按键、进程收到了某个信号或者发生了某个错误等。手机收到新短信或来电时会发出提示音,这就是一种信号,通知用户有新的事件发生。交通信号灯会发出红、黄、绿三种不同的信号,指示车辆和行人何时可以通行。火灾报警器发出警报声,通知人们有火灾发生,需要立即疏散。门铃响起,通知主人有人来访。警报器在发现入侵者时会发出警报声,通知屋主有危险。可选的处理动作有以下三种1. 忽略此信号。

菜菜成长为后端开发大佬 2724

Oracle EBS Tax 四国实现详解:印度、巴西、美国、阿根廷

印度:务必启用India Localization模块,不要尝试用标准EBTax模拟GST逻辑 巴西:必须配置NF-e接口,建议聘请本地税务顾问设置CFOP和NCM代码映射 美国:跨州业务强烈建议购买Vertex或Avalara服务,自建税率表维护成本极高 阿根廷:注意1:1:1架构限制,提前规划Legal Entity和OU结构

金牌架构师 260

爬虫Incapsula reese84加密案例:Etihad航空(纯算法)

爬虫Incapsula reese84加密案例:Etihad航空,本文就不再讲解如何找加密参数、定位加密参数,以及分析加密的一个过程。就直接从扣算法开始,扣算法前先看之前讲解的加密函数生成的过程,文章会一个函数一个函数的讲解扣算法。fiddler根据规则替换本地文件。调试过程中遇到部分环境不一样是正常的,具体还要根据自己调试的js为准,就像之前补环境时是有二十一个循环,这次扣算法多出一个循环,不过大部分环境是一样的第一个函数:通过document.addEventListener添加了很多事件。

老衲爱洗头的博客 1992

Linux:信号的捕捉过程以及信号捕捉函数

信号的捕捉过程以及信号捕捉函数 信号的捕捉过程 我们都说信号的产生之后不是被立即处理的,而是在合适的时候,那么合适的时候是什么时候呢?信号又是怎么被捕捉的呢? 合适的时候是指:从内核态切换为用户态时进行信号的捕捉 在Linux下,我们会发现我们有时候会有一些文件不能进入,有一些文件不能创建,其实这就是一种权限。内核态和用户态都是一种状态,这两种状态表示了两种身份,这两种身份表示了不同的权限等级,我...

ETalien_的博客 777

ROCm rocr-libhsakmt分析系列1-2:多GPU跨卡VRAM访问机制分析

本文基于ROCr-Runtime的libhsakmt库源码,深入分析了多GPU系统中跨设备内存访问的实现机制。主要内容包括: 实现流程概述:通过P2P拓扑发现、统一虚拟地址空间、页表映射和硬件转发四个步骤,实现零拷贝的跨GPU内存访问。

图形/计算GPU的驱动与虚拟化技术分享园地 2507

linux的信号捕捉函数详解

信号捕捉 signal函数 注册一个信号捕捉函数: typedef void (*sighandler_t)(int); sighandler_t signal(int signum, sighandler_t handler); 该函数由ANSI定义,由于历史原因在不同版本的Unix和不同版本的Linux中可能有不同的行为。因此应该尽量避免使用它,取而代之使用sigaction函数。

oguro的博客 5774

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

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

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

信号的捕捉与处理

        前边已经详细介绍了信号的产生,经常说到的一句话应该是向进程发送一个信号,但是进程不是像人,可以自己去感知信号。那么,到底是怎么向通过什么方式将进程发送信号的呢?怎么样算是给进程发送了一个信号呢?      和红绿灯一样,信号其实也就是一种规定。在现实生活中,只有那些在相应领域里有着绝对话语权的人才能给出规定,比如一所学校的校长,能制定校规。那么电脑里边谁能制定规则呢?操作系统,毫无...

半暖的博客 2403

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

【Linux】信号保存与信号捕捉处理

介绍信号的保存,理解信号在操作系统中的保存方式,理解系统中信号捕捉的处理过程以及介绍信号的其它知识!

YoungMLet的博客 2947

阻塞信号和捕捉信号

一 阻塞信号 1 概念: 信号递达:实际执行信号的处理动作称为信号递达(Delivery)。 信号未决:信号从产生到递达之间的状态,称为信号未决(Pending)。 进程可以选择阻塞(Block )某个信号。被阻塞的信号产生时将保持在未决状态,直到进程解除对此信号的阻塞,才执行递达的动作。 注意:阻塞和忽略是不同的,只要信号被阻塞就不会递达,而忽略是在递达之后可选的一种处理动作。 每个

Stand__out的博客 2300

信号(下):信号集函数,信号捕捉,信号捕捉的特性

信号集:什么是信号集,信号集可以粗略的理解为,那个31个信号位的位图(信号集和) 我们没有声明是阻塞信号集的话指的都是未决信号集 信号集函数:man sigemptyset 清空信号集: int sigemptyset(sigset_t *set); 填充信号集: int sigfillset(sigset_t *set); 添加某个信号到信号集: int sigaddset(sigset_t *...

weixin_43767691的博客 448

信号的捕捉以及SIGCHLD信号

一. 信号的捕捉定义     用户提供一个处理函数, 要求内核在处理信号时必须切换到用户态,执行这个函数, 这种方式就叫做信号的捕捉 二. 图解信号的捕捉过程     1. 由上图可以看出,当处理信号的执行动作时用户自定义的时候,此时就需返回该函数去调用该函数, 这就叫做信号的捕捉. 以前我们总是说进程收到信号时会在合适的时候取处理该信号, 现在可以看出,这个合适的时候就是当进程处理...

qq_41027326的博客 1146

深入了解linux系统—— 信号的捕捉

信号捕捉与操作系统运行机制 信号捕捉流程:进程从用户态进入内核态处理系统调用/中断时,内核会检查并递送可处理信号。若信号需自定义处理,需经历4次态切换:用户→内核→用户(信号处理)→内核→用户。整个过程通过栈帧保存现场并恢复执行。 操作系统运行依赖硬件中断机制:外设通过中断控制器通知CPU,CPU查中断向量表执行对应处理程序。时钟中断定期触发进程调度,系统调用通过软中断实现。操作系统本质是一个死循环,通过中断驱动运行。 内核态与用户态区别:用户态执行用户空间代码,通过用户页表映射;内核态执行操作系统代码,通

LH__1314的博客 1298

Linux信号捕捉

信号处理与进程通信机制摘要 操作系统中信号处理涉及内核态与用户态的切换,通过检查block、pending和handler表决定信号处理方式。sigaction系统调用提供了比signal更强大的信号控制能力,支持自动屏蔽信号和自定义处理函数。可重入函数与不可重入函数的区别在于是否访问全局资源,后者可能因信号中断导致数据错乱。volatile关键字确保变量访问直接操作内存而非寄存器,防止编译器优化引发数据不一致。SIGCHLD信号允许父进程异步回收子进程资源,通过设置SIG_IGN可自动清理子进程避免僵尸进

LVZHUO_2022的博客 970

【Linux-进程信号】详谈信号捕捉

在中断处理完毕后要返回用户态的main函数之前检测到有信号SIGQUIT递达,内核决定返回用户态后不是恢复main函数的上下文继续执行,而是执行SigHandler函数,SigHandler函数使用户态的堆栈空间,它们之间不存在调用和被调用的关系,是两个独立的控制流程。当某个信号的处理函数被调用时,内核自动将当前信号加入进程的信号屏蔽字,当信号处理函数返回时自动恢复原来的信号屏蔽字,这样就保证了在处理某个信号时,如果这种信号再次产生.,那么它会被阻塞到当前处理结束为止。:指向信号处理函数的指针。

2202_75331338的博客 1353

【Linux】进程信号——信号保存和信号捕捉

通过本文的探讨,我们深入了解了Linux中进程信号的保存和捕捉机制。信号作为进程间通信的一种重要方式,能够有效地处理异步事件和异常情况。我们学习了信号的基本概念、信号的保存方式(如信号掩码和未决信号集),以及如何通过信号处理函数来捕捉和处理信号。在实际应用中,合理地使用信号机制可以大大提高程序的健壮性和响应能力。然而,信号处理也需要注意一些细节,例如信号处理函数的可重入性、信号竞争条件的避免等。掌握这些知识点,能够帮助我们在编写多进程、多线程程序时更加得心应手。

2301_79969994的博客 1830

【Linux】信号的捕捉(捕捉过程及捕捉函数)

信号的捕捉过程 我们现在知道了信号在产生之后不是被立即处理的,而是在合适的时候才进行处理,那么什么时候是合适的时候呢?信号又是怎么被捕捉的呢? 合适的时候是指:从内核态切换为用户态时进行信号的捕捉。 在Linux下,作为普通用户的我们会发现我们有时候会有一些文件不能进入、有一些文件不能创建、有一些信息不能看、我们创建的进程总数总是有上限的,我们访问不了硬件层面的 东西,感觉自己被限制了,其实...

Miss_Monster的博客 4004

【进程信号】四、信号的捕捉

​当一个任务(进程)执行系统调用而陷入内核代码中执行时,我们就称进程处于内核运行态(或简称为内核态)。此时处理器处于特权级最高的(0级)内核代码中执行。当进程处于内核态时,执行的内核代码会使用当前进程的内核栈。每个进程都有自己的内核栈。​当进程在执行用户自己的代码时,则称其处于用户运行态(用户态)。即此时处理器在特权级最低的(3级)用户代码中运行。当正在执行用户程序而突然被中断程序中断时,此时用户程序也可以象征性地称为处于进程的内核态。因为中断处理程序将使用当前进程的内核栈。

lirendada的博客 1135

信号的捕捉处理

举例如下: 用户程序写了SIGQUIT信号的处理函数sighandler。当前正在执行main函数,这时**发生中断或异常(也可能是系统调用)**切换到内核态。在中断处理完毕后要返回用户态的main函数之前检查到有信号SIGQUIT递达。内核决定返回用户态后不是恢复main函数的上下文继续执行,而是执行sighandler函 数,

Suinnn的博客 743

Linux——信号集操作函数、signal实现信号捕捉、sigaction实现信号捕捉、内核实现信号捕捉简析、⭐借助信号捕捉回收子进程⭐

一、信号集操作函数 只能通过阻塞信号集mask才能去改变未决信号集,而阻塞信号又需要通过自定义一个信号集去改变,通过以下函数就可以创建一个信号集set sigset_t set;//自定义信号集 int sigemptyset(sigset_t *set);//清空信号集 int sigfillset(sigset_t *set);//全部置1 int sigaddset(sigset_t *se...

qq_37299596的博客 567
上一篇: 阻塞信号及相关的函数
下一篇: 【数据结构】------多通路带环迷宫求最短路径(C语言)
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值