搜索
首页系统教程LINUXlinux异步信号handle浅析

linux异步信号handle浅析

Feb 13, 2024 pm 10:03 PM
linuxlinux教程linux系统linux命令外壳脚本嵌入式linuxlinux入门linux学习

Linux系统是一种支持多任务并发执行的操作系统,它可以同时运行多个进程,从而提高系统的利用率和效率。但是,如果这些进程之间需要进行数据交换和协作,就需要使用一些进程间通信(IPC)的方式,例如消息队列、共享内存、信号量等。其中,信号是一种比较简单而灵活的IPC方式,它可以让一个进程向另一个进程发送一个简短的消息,通知它发生了某种事件或异常。Linux系统中的信号有两种类型,分别是同步信号和异步信号。本文将浅析linux异步信号handle的方法,包括异步信号的含义、产生、发送、接收、处理和忽略等方面。

linux异步信号handle浅析

在初学linux编程的时候,一直觉得异步信号handle是个很神奇的东西,用户程序可以使用singal之类的系统调用为某某信号注册一个信号处理函数(handle函数)。
程序的二进制代码在内存中都有着确定的执行流程,为什么收到异步信号以后,程序会被“中断”,然后跳转到这个handle函数里面去运行呢?内核怎么有能力让程序做这样的跳转呢,总不可能临时修改程序的可执行代码吧?

后来学习了一些内核知识,才知道原来进程收到信号以后,并不是立即就被“中断”的,而是先在进程的控制结构(task_struct)中记录下收到了某某信号,然后等到进程即将从内核态返回用户态的时候,流程才被“中断”,handle函数才被调用。
用户进程什么时候会从内核态返回用户态呢?一般主要是三种情况:系统调用(用户进程主动进入内核)、中断(用户进程被动进入内核)、被调度执行(用户进程从等待执行变为正在执行)。
进程从收到信号到它从内核态返回用户态的过程,是需要一定时间的。但是这个时间一般会很短,至少时钟中断会以较大的频率(比如1毫秒一次)将用户进程带入内核(当然,只针对正在执行的进程)。

在进程即将从内核态返回用户态时,如果有信号需要处理,对应的handle函数将被调用(当然,可能没有注册handle,这时内核对信号进行默认的处理)。注意,现在进程还在内核态,内核是怎么调用用户态的handle函数的呢?
直接调用可以吗?当然不行。内核代码运行在高CPU特权级别下,如果直接调用handle函数,则handle函数也将在相同的CPU特权下被执行。那么用户将可以在handle函数里面为所欲为。
所以,调用handle必须先返回用户态。但是返回用户态后,程序流程又不受内核控制了,难不成内核还真的把用户进程的可执行代码临时改掉?

内核实际的做法还是比较巧妙。用户进程进入内核以后,都会在其对应的内核栈上留下返回地址,以便流程返回。内核调用handle函数的办法就是临时改掉栈上的返回地址,然后按原有的返回用户态的流程去返回。结果这一返回,就到了handle函数去了。(当然,需要修改的并不止是返回地址,而是一整个调用栈。)
虽然现在临时把返回地址改了,但是用户进程最终还是要返回到原先那个返回地址去的。那么,原先的返回地址及其调用栈应该保存在哪里呢?进程的内核栈空间有限,并且还需要应付handle函数中可能发生的系统调用,所以内核把这些信息放在内核栈上是不现实的,只能压到了用户栈上去。

当handle函数执行完毕,执行流程要返回到内核去。同样,由于CPU特权级别不同,从handle函数返回内核时不能单纯地利用RET指令去返回的。需要执行一次系统调用。

在handle执行完后,为什么要回到内核,再从内核返回到原始返回地址呢?如果直接返回到原始的返回地址那自然是很便捷。并且要这么做也不难,原始返回地址及其调用栈已经被压到了用户栈上,内核只需要在handle函数的调用栈上稍做手脚就行了。
1、返回到原始返回地址并不是回到那个地址就行了,需要把整个现场都恢复(主要是寄存器什么的)。当然,内核也可以在用户栈上面压一些代码,来完成这些事情;
2、现在可能不止一个信号要处理,最好让用户进程返回内核,继续处理其他信号;

为了返回内核,首先,内核在返回到handle函数之前,先将某个返回地址压到用户栈上,以便从handle返回时能够返回到指定的地址上。这个指定的地址其实也在进程的用户栈上,内核又在这个地址上放了几条指令(在栈上放置可执行代码),让进程去调用一个名叫sigreturn的系统调用。

返回到handle函数前的用户栈大致如下:
原有数据 -> 调用sigreturn的指令(设其地址为a) -> 原始返回地址及其调用栈 -> 返回地址(值为a) -> handle的栈变量

内核在handle函数的调用栈上放置sigreturn指令,这是在linux 2.4时的做法。每次调用用户的handle函数都需要向用户栈拷贝这么几条指令,这并不太好。
linux 2.6有一个叫vsyscall page的页面,上面包含了内核为用户程序准备的一些指令,其中就包括调用sigreturn指令。这个vsyscall页被映射到每个进程的虚拟地址空间靠近末尾的部分,被所有用户进程共享,对于用户进程是只读的。这样,handle函数的调用栈上就不需要再塞入sigreturn指令了,直接将handle函数的返回地址设为vsyscall页中对应的代码即可。

为了让handle执行完以后自动调用sigreturn返回内核,内核做了很多事情。那么可不可以约定好,让用户自己去调用sigreturn呢?
当然,这是可以的。只是为了让信号处理机制成为一套完整的机制,内核并没有这么做。否则用户在handle函数里面忘记调用sigreturn的话,可能莫名其妙地进程就崩溃了。而编译器也很难找出这样的错误。

进程调用sigreturn系统调用重新进入内核后,压在用户栈上的原始返回地址及其调用栈被获取。最终内核又会修改栈,让进程返回用户空间时返回到这个原始返回地址上。

本文浅析了linux异步信号handle的方法,包括异步信号的含义、产生、发送、接收、处理和忽略等方面。通过了解和掌握这些知识,我们可以掌握Linux信号处理的核心知识,从而提高系统的稳定性和效率。当然,linux异步信号handle还有很多其他的特性和用法,需要我们不断地学习和研究。希望本文能给你带来一些启发和帮助。

以上是linux异步信号handle浅析的详细内容。更多信息请关注PHP中文网其他相关文章!

声明
本文转载于:良许Linux教程网。如有侵权,请联系admin@php.cn删除
互联网在Linux上运行吗?互联网在Linux上运行吗?Apr 14, 2025 am 12:03 AM

互联网运行不依赖单一操作系统,但Linux在其中扮演重要角色。Linux广泛应用于服务器和网络设备,因其稳定性、安全性和可扩展性受欢迎。

Linux操作是什么?Linux操作是什么?Apr 13, 2025 am 12:20 AM

Linux操作系统的核心是其命令行界面,通过命令行可以执行各种操作。1.文件和目录操作使用ls、cd、mkdir、rm等命令管理文件和目录。2.用户和权限管理通过useradd、passwd、chmod等命令确保系统安全和资源分配。3.进程管理使用ps、kill等命令监控和控制系统进程。4.网络操作包括ping、ifconfig、ssh等命令配置和管理网络连接。5.系统监控和维护通过top、df、du等命令了解系统运行状态和资源使用情况。

使用Linux别名提高自定义命令快捷方式的生产率使用Linux别名提高自定义命令快捷方式的生产率Apr 12, 2025 am 11:43 AM

介绍 Linux是一个强大的操作系统,由于其灵活性和效率,开发人员,系统管理员和电源用户都喜欢。但是,经常使用长而复杂的命令可能是乏味的

Linux实际上有什么好处?Linux实际上有什么好处?Apr 12, 2025 am 12:20 AM

Linux适用于服务器、开发环境和嵌入式系统。1.作为服务器操作系统,Linux稳定高效,常用于部署高并发应用。2.作为开发环境,Linux提供高效的命令行工具和包管理系统,提升开发效率。3.在嵌入式系统中,Linux轻量且可定制,适合资源有限的环境。

在Linux上掌握道德黑客的基本工具和框架在Linux上掌握道德黑客的基本工具和框架Apr 11, 2025 am 09:11 AM

简介:通过基于Linux的道德黑客攻击数字边界 在我们越来越相互联系的世界中,网络安全至关重要。 道德黑客入侵和渗透测试对于主动识别和减轻脆弱性至关重要

如何学习Linux基础知识?如何学习Linux基础知识?Apr 10, 2025 am 09:32 AM

Linux基础学习从零开始的方法包括:1.了解文件系统和命令行界面,2.掌握基本命令如ls、cd、mkdir,3.学习文件操作,如创建和编辑文件,4.探索高级用法如管道和grep命令,5.掌握调试技巧和性能优化,6.通过实践和探索不断提升技能。

Linux最有用的是什么?Linux最有用的是什么?Apr 09, 2025 am 12:02 AM

Linux在服务器、嵌入式系统和桌面环境中的应用广泛。1)在服务器领域,Linux因其稳定性和安全性成为托管网站、数据库和应用的理想选择。2)在嵌入式系统中,Linux因其高度定制性和高效性而受欢迎。3)在桌面环境中,Linux提供了多种桌面环境,满足不同用户需求。

Linux的缺点是什么?Linux的缺点是什么?Apr 08, 2025 am 12:01 AM

Linux的缺点包括用户体验、软件兼容性、硬件支持和学习曲线。1.用户体验不如Windows或macOS友好,依赖命令行界面。2.软件兼容性不如其他系统,缺乏许多商业软件的原生版本。3.硬件支持不如Windows全面,可能需要手动编译驱动程序。4.学习曲线较陡峭,掌握命令行操作需要时间和耐心。

See all articles

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

AI Hentai Generator

AI Hentai Generator

免费生成ai无尽的。

热门文章

R.E.P.O.能量晶体解释及其做什么(黄色晶体)
4 周前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳图形设置
4 周前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您听不到任何人,如何修复音频
4 周前By尊渡假赌尊渡假赌尊渡假赌
WWE 2K25:如何解锁Myrise中的所有内容
1 个月前By尊渡假赌尊渡假赌尊渡假赌

热工具

适用于 Eclipse 的 SAP NetWeaver 服务器适配器

适用于 Eclipse 的 SAP NetWeaver 服务器适配器

将Eclipse与SAP NetWeaver应用服务器集成。

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

SublimeText3 英文版

SublimeText3 英文版

推荐:为Win版本,支持代码提示!

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

Dreamweaver Mac版

Dreamweaver Mac版

视觉化网页开发工具