Unix/Linux 系统编程中用于管理信号处理行为的核心概念或模型

在 Unix/Linux 系统编程中,管理信号处理行为涉及以下核心概念和模型,它们共同构成了信号处理的框架:


1. 信号(Signal)模型

  • 软件中断:信号是异步事件通知机制,类比硬件中断
  • 预定义类型SIGINT (Ctrl+C)、SIGTERM (终止请求)、SIGSEGV (段错误) 等标准信号
  • 生命周期
    1. 生成(Generation):事件触发信号产生
    2. 递送(Delivery):内核将信号传递给目标进程
    3. 处理(Handling):进程执行注册的处理动作

2. 信号处理行为控制

行为类型说明设置方式
默认行为系统预定义行为(终止/忽略/暂停)SIG_DFL
忽略信号丢弃信号不做任何响应SIG_IGN
自定义处理函数用户注册的信号处理例程函数指针

3. 关键控制机制

(1) 信号阻塞(Blocking)
  • 目的:临时阻止信号递送
  • 实现
    sigset_t mask;
    sigemptyset(&mask);
    sigaddset(&mask, SIGINT);
    sigprocmask(SIG_BLOCK, &mask, NULL);  // 阻塞SIGINT
    
  • 特点
    • 被阻塞的信号处于**挂起(Pending)**状态
    • sigpending() 可获取挂起信号集
    • 解除阻塞后立即递送
(2) 信号屏蔽(Masking)
  • 执行处理函数时自动生效
    • 当前处理的信号自动被屏蔽(除非设置 SA_NODEFER
    • 通过 sa_mask 指定额外屏蔽的信号集
  • 作用:防止信号处理函数被重入

4. 信号处理模型

(1) 单次处理模型
struct sigaction sa = {.sa_handler = handler,.sa_flags = SA_RESETHAND  // 处理一次后恢复默认行为
};
  • 特点:类似传统 signal() 的行为
  • 风险:信号再次发生时可能触发默认行为(如终止进程)
(2) 持久处理模型
struct sigaction sa = {.sa_handler = handler,.sa_flags = 0  // 持续有效
};
  • 特点:处理函数保持激活状态
  • 最佳实践:配合信号阻塞使用
(3) 实时信号处理模型
struct sigaction sa = {.sa_sigaction = rt_handler,.sa_flags = SA_SIGINFO | SA_RESTART
};
  • 特点
    • 支持信号排队(避免丢失)
    • 可携带附加信息(发送者PID、错误地址等)
    • 使用 sigqueue() 发送:
    union sigval value = {.sival_int = 42};
    sigqueue(pid, SIGRTMIN+1, value);
    

5. 关键系统调用

系统调用用途
sigaction()注册信号处理行为(核心接口)
sigprocmask()控制进程信号屏蔽集
sigsuspend()原子操作:设置屏蔽集 + 等待信号
kill()/raise()发送信号(跨进程/自身)
sigaltstack()设置备选信号栈(处理栈溢出信号)

6. 特殊处理场景

(1) 系统调用中断处理
  • 问题:慢速系统调用(如 read())被信号中断
  • 解决方案
    struct sigaction sa = {.sa_handler = handler,.sa_flags = SA_RESTART  // 自动重启被中断的系统调用
    };
    
(2) 信号竞争处理
  • 临界区保护模式
    sigset_t new_mask, old_mask;
    sigemptyset(&new_mask);
    sigaddset(&new_mask, SIGINT);// 进入临界区前阻塞信号
    sigprocmask(SIG_BLOCK, &new_mask, &old_mask);/* 临界区代码(不会被SIGINT中断) */// 等待可能发生的信号
    sigsuspend(&old_mask);// 恢复原始屏蔽集
    sigprocmask(SIG_SETMASK, &old_mask, NULL);
    
(3) 子进程终止处理
void sigchld_handler(int sig) {while (waitpid(-1, NULL, WNOHANG) > 0); // 非阻塞回收所有僵尸进程
}// 注册处理
struct sigaction sa = {.sa_handler = sigchld_handler,.sa_flags = SA_RESTART | SA_NOCLDSTOP
};
sigaction(SIGCHLD, &sa, NULL);

7. 安全编程模型

  1. 异步信号安全(Async-signal-safe):

    • 信号处理函数中只能调用异步安全函数(如 write(), _exit()
    • 禁止调用非可重入函数(malloc, printf 等)
  2. 自包含状态

    volatile sig_atomic_t flag = 0;  // 信号安全标志void handler(int sig) {flag = 1;  // 仅设置标志,主循环中处理
    }
    
  3. 备选信号栈

    stack_t ss = {.ss_sp = malloc(SIGSTKSZ), .ss_size = SIGSTKSZ
    };
    sigaltstack(&ss, NULL);  // 设置备选栈struct sigaction sa = {.sa_handler = handler,.sa_flags = SA_ONSTACK  // 使用备选栈
    };
    

概念关系图

+---------------------+
|   信号产生源         | (硬件/内核/进程)
+----------+----------+| 生成信号v
+---------------------+
|   内核信号队列       | (实时信号排队)
+----------+----------+| 递送决策v
+---------------------+  阻塞?   +----------+
|   进程信号屏蔽集     +--------->| 挂起状态 |
+----------+----------+          +----------+| 未阻塞?v
+---------------------+
|   信号处理分发       |
|  +----------------+ |
|  | 默认行为处理    | |
|  | 忽略信号       | |
|  | 自定义处理函数  | |
|  +----------------+ |
+---------------------+|v
+---------------------+
|   处理函数执行环境   |
|  - 自动信号屏蔽     |
|  - 备选信号栈       |
|  - 中断系统调用     |
+---------------------+

这些核心概念共同构成了 Unix/Linux 信号处理的完整模型,开发者需要理解其交互机制才能编写出健壮可靠的信号处理代码。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/bicheng/92313.shtml
繁体地址,请注明出处:http://hk.pswp.cn/bicheng/92313.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

webrtc弱网-OveruseFrameDetector源码分析与算法原理

一、核心功能CPU负载检测:监控视频帧的捕获、编码、发送全流程耗时,实时计算CPU使用率自适应决策:基于CPU使用率阈值触发视频质量调整(降级/升级)多策略支持:提供新旧两套CPU负载估计算法,支持实…

Spring Cloud系列—Eureka服务注册/发现

上篇文章: Spring Cloud系列—简介https://blog.csdn.net/sniper_fandc/article/details/149936339?fromshareblogdetail&sharetypeblogdetail&sharerId149936339&sharereferPC&sharesourcesniper_fandc&sharefromfrom_link 在上篇文章中&…

QUdpSocket 详解:从协议基础、通信模式、数据传输特点、应用场景、调用方式到实战应用全面解析

前言 在网络通信的世界里,UDP 协议以其独特的 “快准狠” 特性占据着一席之地。作为 Qt 框架中 UDP 协议的封装者,QUdpSocket 为开发者提供了便捷高效的网络编程接口。​ 一、UDP 协议基础:QUdpSocket 的 历史 要理解 QUdpSocket,…

vue中reactive()和ref()的用法

在 Vue 3 的 Composition API 里,reactive() 和 ref() 都是用来把「普通数据」变成「响应式数据」的函数。 一句话区别: reactive() 只能包裹对象/数组;ref() 可以包裹任何类型,但在 模板 里读取时,不需要 .value。 下…

【公考基础】----备考规划篇

公考 公考:国家公务员考试 即:国考和省考 或 参公考试 包括但不限于:国考、省考、事业单位招考、教师招聘考试、军队文职招考等,一切进入国家党政军事业单位的考试。 考公整体流程 备考前:准备备考资料&#xf…

STM32江科大学习笔记,全功能按键非阻塞式实现,按键点击,双击,长按

目录 一、前言 二、关于实现非阻塞的办法 2.1 中断类型的选择 2.2 定时器中断 二、程序流程图 2.1 状态S0空闲状态 2.2 状态S1按键判断长按还是其他的事件 2.3 状态S2按键判断双击或者单击 2.4 状态S3按键已双击状态 2.5 状态S4长按状态 三、编写代码 3.1 按键初始…

动态代理常用的两种方式?

口语化回答好的,面试官,动态常见的两种,一种是 jdk 动态代理,一种是 cglib 动态代理,两者的最主要区别是 jdk 动态代理主要是依赖于接口创建代理对象,cglib 是通过生成子类的方式,不需要接口&am…

StarRocks vs ClickHouse:2025 年 OLAP 引擎终极对比指南

StarRocks 与 ClickHouse:高性能 OLAP 引擎的两种选择在当今数据驱动的商业环境中,选择合适的分析型数据库对于企业数据战略至关重要。StarRocks 和 ClickHouse 作为两款领先的 OLAP(在线分析处理)引擎,各自拥有独特的…

RuoYi-Cloud 微服务本地部署详细流程实录(IDEA + 本地 Windows 环境)

本文以 RuoYi-Cloud 3.x 版本为例,开发工具用的是 IntelliJ IDEA,数据库为 MySQL 8.x,注册中心选用本地 Nacos 2.2.3,Redis 为 3.x/5.x 均可。亲测全流程可用,细节与官方文档略有不同,避免新手踩坑。 目录 …

2025年了,程序员转行还这么难?别愁!大模型这趟“顺风车”,你搭不搭?

在“大龄程序员的未来在何方”这篇文章里比较乐观地介绍了程序员保持竞争力的几个方向,但现实依然是残酷的:很多人将不得不离开软件开发工作,转型去从事其他职业。 当你要这么做时,就会感慨:想不到一切竟如此艰难&…

CEH、OSCP、CISP、CISSP 四大网络安全认证攻略

以下是 CEH、OSCP、CISP、CISSP 四大网络安全认证的详细对比,涵盖认证定位、考试难度、适用场景及职业方向,帮助你快速选择适合自己的证书:1. 核心区别速览认证发证机构定位 考试形式适合人群国际认可度CEHEC-Council道德黑客渗透测试基础选择…

SnapDevelop支持uni-app开发:跨平台与原生体验的完美融合

随着移动互联网的迅速发展,开发者面临着多平台需求和技术挑战。传统开发模式要求为每个平台编写独立代码,不仅浪费时间,还增加了维护难度。作为一款强大的低代码开发工具,SnapDevelop打破了这一局限,通过对uni-app的支…

海康威视相机,MVS连接成功,但无图像怎么办?

问题:准备一个常见的海康 相机去海康机器视觉官网下载MVS软件。打开软件,连接相机。显示连接成功,并能看到相机的信息。点击开始采集发现没有图像解决:右侧找到触发。1. 触发模式 ON2.选择 软触发3 启用自动触发点击采集有图像但一…

Linux systemd 系统管理:systemctl 控制服务与守护进程

Linux systemd 系统管理:systemctl 控制服务与守护进程系统启动过程 Linux 系统的启动过程遵循以下步骤: 开机自检:计算机启动后,BIOS/UEFI 进行硬件自检,确认硬件设备正常MBR 引导:从指定的启动设备读取主…

《Day2-PyTorch Tensor 从入门到实践:核心操作与避坑指南》

一、Tensor的创建 在Torch中张量以 "类" 的形式封装起来,对张量的一些运算、处理的方法被封装在类中,官方文档: torch — PyTorch 2.7 documentation 1. 基本创建方式 以下讲的创建tensor的函数中有两个有默认值的参数dtype和d…

两种格式数据介绍——bin 、 yuv文件

一、场景存储 通常指的是用于存储摄像头或传感器原始采集数据的文件格式,尤其是在自动驾驶、机器人、安防、工业视觉等需要记录真实世界场景的应用中。格式存储内容用途场景特点.binLiDAR点云、毫米波雷达数据、IMU、GPS、原始传感器帧自动驾驶仿真、SLAM建图、数据…

【网络运维】Linux:SELinux简介和配置

SELinux 介绍 SELinux 概述 文件权限控制了哪些用户或用户组可以访问哪些特定文件,但未限定用户访问文件的方式。 例如:对于文件的写入权限而言, 结构化数据文件是否应当设计为只能使用特定的程序写入,但其他编辑器仍可以打开和修…

GaussDB SQL执行计划详解

1 问题现象SQL执行计划是GaussDB性能分析及调优的核心,它输出三个关键信息:访问路径:扫描表数据的路径。连接顺序:多表连接顺序。连接方式:多表连接方式。2 技术背景GaussDB SQL语句执行计划是数据库为运行SQL语句而执行的操作步骤…

02.【数据结构-C语言】顺序表(线性表概念、顺序表实现:增删查、前向声明、顺序表实现通讯录项目:增删改查、通讯录数据导入及保存到本地文件)

目录 1. 线性表 2. 顺序表概念及分类 2.1 顺序表的概念 2.2 顺序表分类 2.3 动静态顺序表对比 3. 顺序表的实现(附完整版代码) 3.1 顺序表结构体声明 3.2 初始化&销毁 3.3 插入(尾插、头插、指定位置之前插入) 3.4 …

MyBatis核心配置深度解析:从XML到映射的完整技术指南

🔧 MyBatis核心配置深度解析:从XML到映射的完整技术指南 🚀 引言:MyBatis作为Java生态中最受欢迎的持久层框架之一,其强大的配置体系是实现灵活数据访问的核心。本文将深入解析MyBatis的配置文件架构、映射机制以及高级…