当前位置: 首页 > article >正文

Linux 信号(结合系统理解)

目录

1.什么是信号

1.1信号的概念

1.2操作系统有哪些信号

2.信号是如何产生的 (部分产生方式)

2.1 通过终端按键产生信号

2.2 调用系统函数向进程发信号

 2.3 硬件异常产生信号

core和term的区别

3.信号的产生

3.1信号在内核中的表示

4.信号的捕捉

4.1 内核态和用户态


1.什么是信号

1.1信号的概念

信号是进程之间事件异步通知的一种方式,属于软中断。

1.2操作系统有哪些信号

可以通过kill -l命名查看

2.信号是如何产生的 (部分产生方式)

2.1 通过终端按键产生信号

例如使用ctrl+c 或 ctrl+z 来关闭进程。

2.2 调用系统函数向进程发信号

可以通过 man 2 kill 来查看具体用法。

 2.3 硬件异常产生信号

当我们代码出现除零错误或访问一些非法地址时为什么程序会崩溃呢?

实际上是操作系统给我们的进程发送了对应的信号。

core和term的区别

core类型的信号通常指的是那些能够导致进程终止并生成core文件的信号

当进程接收到这类信号时,它会立即终止执行,并可能生成一个core文件,该文件包含了进程终止时的内存映像和其他相关信息,可用于后续的调试和分析。

常见的core类型信号包括SIGSEGV(无效内存引用)、SIGBUS(总线错误)等。

云服务器默认core file size 为0表示没有开启core dump功能。

可以通过 ulimit -c + corefilesize来开启core dump例如 ulimit -c 10240

调试方法:

//gdb 调试 
//输入 core-file your_corefile_name(ubuntu系统一般就叫core)
//然后就可以自动定位到程序崩溃的位置了

term类型的信号通常指的是那些用于请求进程正常终止的信号。 

当进程接收到这类信号时,它会根据预设的信号处理函数或默认动作来执行相应的操作,以完成进程的终止过程。

常见的term类型信号包括SIGTERM(请求终止进程)、SIGINT(中断进程,通常由用户按下Ctrl+C产生)等。

3.信号的产生

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

3.1信号在内核中的表示

在task_struct(PCB)中有block,pending,handler字段前两个是位图最后一个是函数指针数组。 内核中做了封装不太看得出来。如下图。

 

pending表用于记录已经产生但尚未被递达的信号。这些信号可能是因为被阻塞而处于等待状态,或者是因为进程正在执行其他任务而无法立即处理。 

block表用于记录进程希望阻塞(即忽略或延迟处理)的信号。

handler表示执行什么信号动作,例如忽略,默认,自定义

所以操作系统结合两张表就可以知道要执行那些信号动作,根据handler就可以知道该怎么执行信号动作。

引发问题:那么操作系统什么时候处理未决的信号呢?

4.信号的捕捉

如图大部分情况我们程序执行都是在用户态的,当因为中断,异常,系统调用是会进入内核态。当从内核态重新切换回用户态时,操作系统会先处理这些未决的信号。 

4.1 内核态和用户态

一、内核态

定义与特点:

内核态是操作系统内核所运行的模式,也称为核心态、管态或特权态。

运行在该模式的代码可以无限制地对系统存储、外部设备进行访问。

内核态代码运行在处理器特权级别最高(通常是0级)的模式下,可以执行指令集中的任何指令,并且可以访问系统中的任何存储位置。

功能与作用:

内核态代码负责执行操作系统的核心功能,如内存管理、进程调度、设备驱动等。

它能够处理系统调用、中断和异常,确保系统的稳定运行。

二、用户态

定义与特点:

用户态是用户程序运行的模式,也称为目态或非特权态。

运行在用户态的程序不能直接访问操作系统的数据和程序,也不能执行特权指令,如停止处理器、改变模式位或发起I/O操作。

用户态程序只能访问操作系统分配给它的资源,受到操作系统的严格控制。

限制与安全:

用户态程序的执行受到处理器的诸多检查,以防止恶意程序或错误程序损害系统。

用户态程序试图执行特权操作会导致操作系统中断其执行,并通过系统调用请求内核的帮助。

三、内核态与用户态之间的切换

系统调用:

用户态程序通过系统调用申请使用操作系统提供的服务程序完成工作。

系统调用触发中断,CPU切换到内核态执行相应的内核代码。

内核处理完请求后,将结果返回给用户态程序,并恢复用户态程序的上下文信息。

中断:

中断是由硬件设备或软件异常触发的,导致CPU切换到内核态处理中断事件。

中断处理完成后,CPU恢复中断发生之前的用户态程序的上下文,并继续执行。

异常:

当CPU在执行运行在用户态下的程序时,发生了某些事先不可知的异常(如除零错误、内存访问违规等),会触发由当前运行进程切换到处理此异常的内核相关程序中,从而转到内核态。


http://www.kler.cn/a/468678.html

相关文章:

  • 30、论文阅读:基于小波的傅里叶信息交互与频率扩散调整的水下图像恢复
  • AI Agent 开发共学招募 | 来 Sui 上探索自治智能的边界
  • C# 设计模式(结构型模式):外观模式
  • LEED绿色建筑认证在2025年相关消息
  • python 如何调整word 文档页眉页脚
  • 鸿蒙HarmonyOS开发:基于Swiper组件和自定义指示器实现多图片进度条轮播功能
  • 小结:DNS,HTTP,SMTP,IMAP,FTP,Telnet,TCP,ARP,ICMP
  • C#设计模式(行为型模式):状态模式
  • web实操9——session
  • 基于傅立叶神经网络(FNN)与物理信息神经网络(PINN)求解泊松方程(附Pytorch源代码)
  • 高等数学学习笔记 ☞ 连续与间断
  • weblogic安装 12.2.1.4.0 单机
  • 工程师了解的Lua语言
  • Python 使用会话 ID 管理多轮对话
  • web应用安全评估报告:会话Cookie未设置Secure属性(如果网站未部署 HTTPS,则无法使用 Secure 属性。)
  • 计算机网络--路由表的更新
  • Verilog语法之模块与端口
  • 基于LightGBM的集成学习算法
  • sniff2sipp: 把 pcap 处理成 sipp.xml
  • 深入探讨服务器虚拟化:架构、技术与应用
  • 在 macOS 中,设置自动将文件夹排在最前
  • 小程序组件 —— 28 组件案例 - 推荐商品区域 - 实现结构样式
  • React 如何进行路由变化监听
  • qt-C++笔记之动画框架(Qt Animation Framework)入门
  • 【Unity报错】error Cs0103: The name ‘keyCode‘ does not exist in the current context
  • 《机器学习》——决策树