尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
Linux:信号的认识、信号的产生、信号的保存、信号的处理
一、对信号的宏观认识从实际的场景来举例:红绿灯、上课铃声电话铃声等都是一种信号的产生,而我们对这种信号处理的方式是后天训练而形成的如:红灯停绿灯行。所以对于OS的信号而言,也就是工程师们内置提前写好的对于对信号怎么处理有三种方式:怎么进⾏信号处理啊a.默认在OS默认约定的各个信号的产生做出什么行为b.忽略(产生信号不做处理)c.⾃定义(用户自定义产生信号后的处理方式)后续都叫做信号捕捉。二、信号的产生我们产生信号的方式有这几种: 终端上命令产生、敲键盘按键产生、函数调用产生、软件条件产生、硬件异常产生常用的信号:kill -l 查询所有信号信号也就是个整数数字旁边的单词是这个信号的宏终端命令产生: kill -数字 进程的pid比如: kill -9 pid 就是终止这个进程所以这里我们也可以发现发送信号不是新建一个进程而是把信号发送给指定的进程这也说明信号是给当前进程产生的那怎么给信号的呢? 那肯定是OS给task_struct结构体的呀!!那本质信号不就是个变量嘛但实际是个位图储存信号32个比特位刚好能对应1~31这些信号敲键盘按键产生:ctrl c :发送2号信号-终止前台进程(只有前台进程才能接收键盘的操作); ctrl : 发送3号信号-也是终止进程(但它是异常终止,硬件异常那里讲区别);ctrl z : 发送20号信号-将前台进程挂起放到后台;函数调用产生:首先先来学一个函数: signal(sig_num,void (*)(int)-这是函数指针) 也就是这个函数能自定义信号处理按你写的函数处理⚠️⭐⭐⭐⭐⭐硬件异常产生:这里的硬件异常对出对应的就是除0异常和野指针的访问,还有比如数组访问越界也是访问未知的地址也差不多是野指针的访问,为什么这些异常是硬件呢?因为你做运算和访问地址本质就是CPU或者MMU等硬件帮你做的运算最终通过一系列操作返回用户想要的结果嘛比如我以演示除0异常:这里显示翻译过来是浮点数错误也就是除0错误是对应发出8号信号那我如果自定义信号·而且不主动退出进程看看会发生什么也就是在main函数里加上signal(8,test):最后会一直死循环,那为什么会死循环呢?这里面涉及很多硬件底层知识我用最直白的话说:除零异常后我们并没有清理内存关闭进程打开的⽂件切换进程等操作所以CPU中还保留上下⽂数据以及寄存器内容除零异常会⼀直存在就有了我们看到的⼀直发出异常信号的现象。访问⾮法内存其实也是如此也就是当出现异常后就不会往后面执行代码如果你改了信号处理的默认处理方式且没有写exit()这样的函数使进程退出时就会一直执行这个错误然后就一直发送信号一直循环软件条件产生:讲这个先讲一个个好玩的函数:alarm()函数(闹钟函数)是给进程计时的它是发出14号信号,然后退出该进程如上demo是进程运行两秒后退出,你也可以不退出自定义信号处理,这不就是可以变相使使用这个函数加signal()函数就能使进程过几秒后做什么任务么,⚠️但注意:这个函数是一次性的也就是过两秒后不会执行第二次故想要一直运行要在自定义函数信号处理面也加上alarm重新计时,这样就能实现进程过几秒后执行任务的类似功能如何理解软件条件在操作系统中信号的软件条件指的是由软件内部状态或特定软件操作触发的信号产⽣机制。这些条件包括但不限于定时器超时如alarm函数设定的时间到达、软件异常如向已关闭的管道写数据产⽣的SIGPIPE信号等。当这些软件条件满⾜时操作系统会向相关进程发送相应的信号以通知进程进⾏相应的处理。简⽽⾔之软件条件是因操作系统内部或外部软件操作⽽触发的信号产⽣。拓展:core dumped核心转储进程收到特定致命信号异常终止操作系统把进程崩溃瞬间内存、寄存器等运行现场保存为 core 文件用于后续 gdb 调试定位崩溃原因。例如Ctrl\、段错误、除零错误都会触发 core dumped。一句话总结信号产生-异步信号按键、kill、alarmhandler return(自定义信号处理)执行下一条代码不会重复触发信号。补充如果不自定义信号处理(或叫捕获)使用信号默认处理动作收到信号会直接终止进程后续代码无法执行。-硬件 Fault 同步信号SIGFPE、SIGSEGVhandler return 后重试出错指令错误存在就死循环。二、信号保存信号产生了但不代表信号就要立即处理要等到合适的时候处理所以这个时候就需要把信号先保存,上面已经说过信号本质就是位图结构在认识信号之前先来学习一些其他概念• 实际执⾏信号的处理动作称为信号递达(Delivery)(会在合适的时候调用handler函数)• 信号从产⽣到递达之间的状态,称为信号未决(Pending)。• 进程可以选择阻塞(Block)某个信号。• 被阻塞的信号产⽣时将保持在未决状态,直到进程解除对此信号的阻塞,才执⾏递达的动作.• 注意,阻塞和忽略是不同的,只要信号被阻塞就不会递达,⽽忽略是在递达之后可选的⼀种处理动作。其实信号阻塞、信号未决、信号递达这些都是位图结构(实际是结构体但我们为了简化就把它们当作一个整数它们都在task_struct结构体中信号阻塞跟信号未决类似假如二号信号被堵塞那就第二位比特位置置为1同理pending也一样,第二位比特位为1就代表有二号信号未决handler是一个函数指针数组它的下标索引映射就是每个信号的信号处理函数里面保存的就是函数地址每个信号对应一个处理方式-SIG_DFL默认动作比如 SIGINT 默认终止进程 -SIG_IGN忽略信号信号递达之后直接丢掉不做任何操作自定义函数用户自己写的信号处理函数递达后跳转到用户态执行。这里再延伸一下:默认教材是把block和pending的位图叫做信号集(sigset_t这是内核里才有的数据类型),block又叫做信号屏蔽字pending叫做信号集。下面来学习一下一些函数还有一个sigpending(sigset_t* set)设置pending的信号集二、操作系统是怎么运行的引出新概念-中断打断 CPU 当前正在执行的工作转而去处理紧急事件处理完成后再回来继续原来的任务。硬件中断指的是键盘、声卡、网卡等硬件外设向中断控制器发送信号由中断控制器提交中断号给 CPU时钟中断⭐⭐⭐⭐⭐可以把它当作跟硬件一样但它不同的是它是周期性的发送事件(实际它已经被集成在CPU里面因为外设和CPu交互效率低),它专有名词是时钟源。它的流程和硬件触发事件是一样的不同的就是它的中断号映射到的函数方法是不同的所以说我们以前学到的什么进程切换进程调度都是和这个有关系的这里有几个概念说清楚时间片:它是一个进程调度的时间本质就是一个计数器因为时钟中断是周期性的所以每次时钟中断把当前进程的时间片-1是否 0 ; 0 -继续进程调度 0代表该进程调度结束需要切换进程调度(打上需要调度标记不是立刻在中断内部切换等中断返回用户态前夕才做进程切换。)。意义实现抢占式调度。可以强制夺走 CPU防止单个进程一直霸占 CPU 不放让多个就绪进程轮流使用 CPU。注意不是所有进程同等机会优先级、进程阻塞状态都会影响。那它既然是周期性中断那没有进程怎么办? 所以它本质是个死循环(因为操作系统从你一开机就不会停止)里面有个for (;;) pause();没有任务就一直执行这个循环一旦来了进程就执行上面的操作⭐⭐⭐所以我们能知道我们所说操作系统也是软件本质它也是靠硬件中断来对进程做调度也就是被动进行的!软中断也就是不是靠硬件触发的中断而是可以通过软件触发说明程序员也能通过代码实现中断典型的就是系统调用,软中断 用户态主动触发陷入内核int 0x80/syscall系统调用)(实际软中断不止系统调用)那我们好像比如调用read()、write()等系统调用函数我们也没感受到呀?那是因为本质这些系统调用都是C语言写的是C标准库给我们做的封装,内核存在很多系统调用函数它们的地址保存在_sys_call这个数组里面我们这个内核调用系统调用叫做陷阱还有一些异常也可以规划到软中断:比如缺页中断、除0和野指针等所以:广义软中断 软件触发的事件陷阱 (系统调用) 各类异常缺页、除 0三、用户态和内核态其实我们对于一个进程的虚拟地址空间分为两部分:用户区和内核区以我们的4G的空间来看用户态: 0~3GB; 内核态:3GB~4GB;四、信号捕捉有了对操作系统怎么运行和用户态和内核态的概念再谈这个就非常简单了比如我们用键盘发信号信号处理的流程: 键盘发送信号-发生键盘中断--由用户态变为内核态-修改pending-返回用户态瞬间先处理信号-默认、忽略在内核完成,但自定义捕捉需要切回用户态-处理完成后返回内核态-恢复之前因为中断保存的上下文恢复-最后返回用户态继续执行代码这张图能很好的解释:再来学一个捕捉函数: sigaction函数它的作用和signal差不多但是还是有区别的五、其他拓展知识可重入函数用一个实例引出如上我们要进行头插节点首先我要头插node1,在执行完p-nexthead时因为时钟中断或其他原因导致需要处理信号那恰好信号处理函数里也是insert插入但它是插入node2,那此时的head指向的是node2,当处理完时返回内核恢复main函数的上下文继续执行下一条代码headp时,head最终指向head1,但你看上图发现了node2没人指向就发生了内存泄漏像上例这样,insert函数被不同的控制流程调⽤,有可能在第⼀次调⽤还没返回时就再次进⼊该函数,这称为重⼊,insert函数访问⼀个全局链表,有可能因为重⼊⽽造成错乱,像这样的函数称为不可重⼊函数,反之,如果⼀个函数只访问⾃⼰的局部变量或参数,则称为可重⼊(Reentrant)函数。如果⼀个函数符合以下条件之⼀则是不可重⼊的:• 调⽤了malloc或free,因为malloc也是⽤全局链表来管理堆的。• 调⽤了标准I/O库函数。标准I/O库的很多实现都以不可重⼊的⽅式使⽤全局数据结构volatile一个例子说明所以为了避免编译器优化 可以在 定义flag时加一个volatile 告诉编译器检测判断要先走内存在加载到CPU然后进行判断,这两个知识在线程部分可能体现更明显信号之旅结束了!!!
RELATED

相关推荐

内测分发折腾史:从微信传包到海哈游分发

内测分发折腾史:从微信传包到海哈游分发

做独立开发这几年,写代码的时间其实只占一半,另一半全耗在了“把包送到测试同学手里”这件事上。今天想聊聊内测分发这个看似不起眼、实则极其磨人的环节,以及我最终怎么用 海哈游分发 把这事儿理顺的。一、那些年我发内测包踩过的坑最开始&a…

📅 2026/10/17 6:44:16
一根线的显相:人体拓扑论

一根线的显相:人体拓扑论

—— 关于人体拓扑生长原理及未来仿生体路径的假说 本文为作者(道影子)基于内观体悟所提出的一个思想假说,非实证科学结论。文中涉及 "维性力网"" 人体拓扑 " 等概念,均为本体系内的自洽设定,供同…

📅 2026/10/17 6:44:16
小说推文配套漫剧生产,知漫剧高速生成成片方案

小说推文配套漫剧生产,知漫剧高速生成成片方案

引言: 短剧漫剧赛道持续升温,小说推文的玩法也在升级——文字推文配漫剧成片,成了完播率最高的组合。推文拼的不再是文案,是配套产能。 小说推文配漫剧,拼的是生成速度。知漫剧(zz.jiaxunai.cn&#xff09…

📅 2026/10/17 6:44:16
MORE NEWS

更多资讯

📰

视频孪生与空间智能赋能智慧管廊:从方案设计到落地复盘

在智慧城市项目里待久了,你会发现一个规律:越是贴在地表、关乎民生的基础设施项目,做智能化改造越不“性感”,但做得好的价值感也越强。地下综合管廊就是一个典型场景——管线密布、环境封闭、巡检路径长,传统的管理方…

📰

人工智能辅助数学猜想生成:模式挖掘、过滤与人机协作

1. 从计算验证到猜想生成:AI在数学发现中的角色跃迁“人工智能应用-和数学家做朋友:06.新数学猜想生成”这个题目,放在五六年前看,大概率会被当成科幻设定。那时候AI在数学圈的主流身份还是“验证者”——你告诉它猜想是什么&…

📰

Linux压缩命令实战:从tar、gzip到zip/7z的完整指南

说实话,Linux 下的压缩命令是个“看着简单,用起来全是坑”的话题。我最早在服务器上处理日志、备份数据和传发布包的时候,就走错过不少方向。一开始以为把tar -czvf背熟就是全部,直到有一次三百多兆的日志在终端里刷屏&#xff0c…

📰

OpenClaw插件化架构实战:15个核心Skills重构AI工作流

这两年我一直在折腾 AI 工作流,换到 OpenClaw 之后,最大的感受就是插件化架构带来的变化。它把原本揉成一团的自动化脚本,拆成了一个个独立的小单元,官方叫法就是 Skill。再通过 15 个核心 Skills 重新组装业务链路,整…

📰

UVM验证环境实战:覆盖率驱动收敛与组件设计全解析

做芯片验证这些年,我越来越意识到一个问题:验证环境的能力边界,往往就是整个项目质量的边界。前一阵我在模拟项目X里负责一块32位处理核子系统的验证工作,团队内部把这套基于UVM搭建的验证环境定了个代号叫UVM32,它不是…

📰

声纹识别技术全解:从原理、特征提取到工程部署与避坑指南

做机器听觉这些年,声纹识别(Voiceprint Recognition)是身边人问得最多的方向之一。很多朋友觉得,人脸识别早就普及了,声音也该能像指纹一样,拿来做身份认证。这个想法没有错,但落到工程上坑不少…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬