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

Linux的奇妙冒险———进程信号

进程信号

一.信号概念

1.查看信号

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

kill -l #查看信号

在这里插入图片描述
每个信号都有⼀个编号和⼀个宏定义名称,这些宏定义可以在signal.h中找到

  • 非可靠信号(不可靠信号): 指的是信号值 1 到 31 之间的信号(即传统的标准信号,如 SIGINT, SIGTERM 等)。之所以“不可靠”,主要在于它们不支持排队,可能会丢失。

  • 可靠信号(实时信号): 指的是信号值 34 到 64 之间的信号(即 SIGRTMIN 到 SIGRTMAX)。之所以“可靠”,主要在于它们支持排队,不会丢失。

2.信号产生

信号产生大致分为
1.由用户与终端交互产生
Ctrl+C, Ctrl+, Ctrl+Z等等,直接向当前进程发送信号
2.由指令产生
kill -信号给指定进程
3.由系统调用,函数接口产生
kill(), kill 命令, abort(),raise 任意指定信号, SIGABRT
4.由硬件异常进行调用
非法内存访问, 除零错误
在CPU中有⼀些控制和状态寄存器,主要⽤于控制处理器的操作,通常由操作系统代码使⽤。状态寄存器可以简单理解为⼀个位图,对应着⼀些状态标记位、溢出标记位。OS会检测是否存在异常状态,有异常存在就会调⽤对应的异常处理⽅法。
5.软件条件产生
在操作系统中,信号的软件条件指的是由软件内部状态或特定软件操作触发的信号产⽣机制。这些条件包括但不限于定时器超时(如alarm函数设定的时间到达)、软件异常(如向已关闭的管道写数据产⽣的SIGPIPE信号)等。当这些软件条件满⾜时,操作系统会向相关进程发送相应的信号,以通知进程进⾏相应的处理。简⽽⾔之,软件条件是因操作系统内部或外部软件操作⽽触发的信号产⽣。

core VS term

  • core区别于term,它会在退出时生成核心转储文件,在内存泄漏或程序崩溃时将部分程序信息保存起来,方便查看和调试
    SIGQUIT (3): Core 的典型代表。由 Ctrl+\ 产生。如果你在终端前台运行一个程序,按下 Ctrl+\,它会立即终止并(在条件满足时)生成一个 core 文件。
    SIGSEGV (11): 段错误(Segmentation Fault)。当进程访问了不属于它的内存(如空指针解引用、数组越界)时,由硬件异常触发,内核发送此信号。这是最常见的导致 Core 的信号。
    SIGABRT (6): 中止(Abort)。由 abort() 系统调用产生。通常用于库函数(如 glibc)在检测到内部严重错误(如 double free)时主动调用,终止自己并生成 core 文件以便调试。
    SIGFPE (8): 算术异常。如除以零。
    SIGILL (4): 非法指令。

  • term: 进程立即或优雅地停止执行。操作系统回收其占用的所有资源(内存、文件描述符等)。没有额外的诊断数据产生SIGTERM (15):
    Term 的典型代表。这是 kill 命令的默认信号。它表示“请温和地终止(terminate)”。进程可以捕获(catch)这个信号,执行一些清理工作(如关闭文件、释放资源)后再退出。这是一种允许“优雅关机”的信号。
    SIGINT (2): 由 Ctrl+C 产生。行为类似 SIGTERM,通常用于中断前台进程。
    SIGKILL (9): 最强力的 Term。它不能被进程捕获或忽略。内核会直接强行杀死进程,不给任何清理的机会。这是一种“立即断电”式的终止。
    SIGHUP (1): 通常用于通知守护进程“重新加载配置文件”,但许多程序的默认行为是终止。

二. 信号保存

1.概念

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

在信号保存过程中,有三张表
在这里插入图片描述
每个信号都有两个标志位分别表⽰阻塞(block)和未决(pending),还有⼀个函数指针表⽰处理动作。信号产⽣时,内核在进程控制块中设置该信号的未决标志,直到信号递达才清除该标志。在上图的例中,SIGHUP信号未阻塞也未产⽣过,当它递达时执⾏默认处理动作。
SIGINT信号产⽣过,但正在被阻塞,所以暂时不能递达。虽然它的处理动作是忽略,但在没有解除阻
塞之前不能忽略这个信号,因为进程仍有机会改变处理动作之后再解除阻塞
SIGQUIT信号未产⽣过,⼀旦产⽣SIGQUIT信号将被阻塞,它的处理动作是⽤⼾⾃定义函数sighandler。

2.操作

  • struct sigset_t 系统提供的信号集
    这个类型
    可以表⽰每个信号的“有效”或“⽆效”状态,在阻塞信号集中“有效”和“⽆效”的含义是该信号
    是否被阻塞,⽽在未决信号集中“有效”和“⽆效”的含义是该信号是否处于未决状态
  • 信号集操作函数
#include <signal.h>
int sigemptyset(sigset_t *set);
int sigfillset(sigset_t *set);
int sigaddset(sigset_t *set, int signo);
int sigdelset(sigset_t *set, int signo);
int sigismember(const sigset_t *set, int signo);

函数sigemptyset初始化set所指向的信号集,使其中所有信号的对应bit清零,表⽰该信号集不包含任何有效信号。
• 函数sigfillset初始化set所指向的信号集,使其中所有信号的对应bit置位,表⽰该信号集的有效信号包括系统⽀持的所有信号。
• 注意,在使⽤sigset_t类型的变量之前,⼀定要调⽤sigemptyset或sigfillset做初始化,使信号集处于确定的状态。初始化sigset_t变量之后就可以在调⽤sigaddset和sigdelset在该信号集中添加或删除某种有效信号。

#include <signal.h>
int sigprocmask(int how, const sigset_t *set, sigset_t *oset);

如果oset是⾮空指针,则读取进程的当前信号屏蔽字通过oset参数传出。如果set是⾮空指针,则更改进程的信号屏蔽字,参数how指⽰如何更改。如果oset和set都是⾮空指针,则先将原来的信号屏蔽字备份到oset⾥,然后根据set和how参数更改信号屏蔽字。假设当前的信号屏蔽字为mask,下表说明了how参数的可选值。
在这里插入图片描述

#include <signal.h>
int sigpending(sigset_t *set);

读取当前进程的未决信号集,通过set参数传出。
调⽤成功则返回0,出错则返回-1

三.信号捕捉

1.信号捕捉流程

在这里插入图片描述
在这里插入图片描述

2.sigaction信号捕获

#include <signal.h>
int sigaction(int signo, const struct sigaction *act, struct sigaction *oact);

struct sigaction
在这里插入图片描述
sigaction函数可以读取和修改与指定信号相关联的处理动作。调⽤成功则返回0,出错则返回-1。
signo是指定信号的编号。若act指针⾮空,则根据act修改该信号的处理动作。若oact指针⾮空,则通过oact传出该信号原来的处理动作。act和oact指向sigaction结构体:
在这里插入图片描述

http://www.dtcms.com/a/350672.html

相关文章:

  • 滲透測試工具
  • Microsoft 365 中的 Rules-Based Classification 功能深度解析:企业数据治理与合规的智能基石
  • 25年8月通信基础知识补充2:星座的峭度(Kurtosis)、ISAC
  • 朴素贝叶斯分类器
  • A股市场高级日历效应详解与实战指南
  • 【P2P】P2P主要技术及RELAY服务1:python实现
  • 【Git】fatal: Unable to create ‘.git/index.lock’: File exists.
  • 迁移面试题
  • 亚远景- 从算法到刹车片:ISO/PAS 8800如何量化自动驾驶的“安全冗余”?
  • Life:Internship in OnSea Day 64
  • PyTorch损失函数全解析与实战指南
  • 高性能C++实践:原子操作与无锁队列实现
  • C++ #pragma
  • C++初阶(3)C++入门基础2
  • 现代C++工具链实战:CMake + Conan + vcpkg依赖管理
  • MYSQL的bin log是什么
  • JUC并发编程08 - 同步模式/异步模式
  • ROS2 python功能包launch,config文件编译后找不到
  • 链表OJ习题(2)
  • 搭建基于LangChain实现复杂RAG聊天机器人
  • AI在软件研发流程中的提效案例
  • 在vue3后台项目中使用热力图,并给热力图增加点击选中事件
  • Java中删除字符串首字符
  • 【51单片机】【protues仿真】基于51单片机数码管温度报警器系统
  • AR眼镜赋能水利智能巡检的创新实践
  • 算法题打卡力扣第167题:两数之和——输入有序数组(mid)
  • VASP计算层错能(SFE)全攻略2
  • python自学笔记12 NumPy 常见运算
  • QT(1)
  • 独立显卡接口操作指南