文章目录

    • 概述
    • 信号类型
      • 可靠信号与不可靠信号
      • Fatal信号与Non Fatal信号
      • 不可捕获/忽略信号
    • 信号工作机制
      • 信号处理方式
      • 信号嵌套处理
    • 信号使用
      • 信号发送
        • kill命令
      • 注册信号处理函数
    • 信号安全与函数可重入性
      • 可重入函数
      • 线程安全与可重入性
    • 相关参考

概述

Linux信号机制是进程间通信的一种方式,用于在不同进程之间传递信息,它通过向目标进程发送一个特定的信号,来触发目标进程执行相应的处理操作。信号本质上是在软件层次上对中断机制的一种模拟,可以认为是用户态下的中断机制,它为用户进程提供了一种处理异步事件的方法;用户进程可以注册自定义的信号处理函数,在进程响应外部信号时,会自动调用回调进行处理。

信号类型

Linux定义了64种信号类型,每个信号都有唯一的编号进行标识。在系统中,通过kill -l命令可以查看所有的信号类型。

可靠信号与不可靠信号

Linux信号可以分为不可靠信号和可靠信号。

  • 不可靠信号:又称非实时信号,是指在信号传递过程中可能丢失或产生不可预测行为的信号,这意味着当一个进程接收到该信号时,无法确保该信号一定会被进程处理。1-31号信号为不可靠信号
  • 可靠信号:又称实时信号,是保证传递和处理的信号。当一个进程接收到可靠信号时,系统会确保该信号不会丢失,并且会等待进程处理完该信号后再继续执行其他操作,Linux使用队列来保存待处理的信号,保证它们按照接收的顺序被进程处理。34-64号信号为可靠信号

在日常开发及维护时,见到的基本是不可靠信号:
在这里插入图片描述

Fatal信号与Non Fatal信号

对于每一个信号,系统都有默认的处理行为,根据信号的默认处理行为,可以将信号分为 Fatal(致命)信号和 Non-Fatal(非致命)信号。

  • Fatal信号:Fatal 信号是指那些默认处理行为会导致进程终止的信号。当进程收到这类信号且没有注册自定义处理函数时,进程会被终止。
  • Non Fatal信号:Non-Fatal 信号是指那些默认处理行为不会导致进程终止的信号。这些信号通常用于控制进程状态或通知特定事件。

不可捕获/忽略信号

在Linux系统中,用户通常可以捕获信号,并自定义处理信号处理行为;但有两个信号比较特殊,它们既不能忽略,也不能捕获,只能执行默认处理:

  • SIGKILL (9):强制终止进程
  • SIGSTOP (19):暂停进程

信号工作机制

与中断的实时响应(CPU执行完一条指令后,就会响应中断请求)不同,进程对信号的处理有一定的滞后性。原因在于,当应用进程接收到其它进程发送的信号时,不会立即做出响应,只有等当前进程陷入到内核空间时,才会进行信号检测。Linux系统中,应用程序处理信号的流程示意如下:
在这里插入图片描述

可以看到,系统对信号的检测与响应总是发生在内核态,只有当前进程由于系统调用、中断或异常而进入系统空间以后,从系统空间返回到用户空间的前夕,内核才会进行信号的处理。

检测到信号后,内核在用户栈创建新层,将返回地址指向信号处理函数,确保函数在用户态执行,避免权限泄露;信号处理程序执行完成后,会执行sigreturn系统调用再次切换到内核态,再由恢复原系统调用或代码执行点。

信号处理方式

在进程接收到一个信号时,可以告诉内核按照下列三种方式之一进行处理:

  • 忽略信号:对信号不做任何处理(但 SIGKILL 和 SIGSTOP 不能被忽略);
  • 捕获信号:注册自定义的信号处理函数;
  • 默认处理:执行系统定义的默认动作。Linux信号的默认处理行为可以分为以下几类:
    • Terminate:终止进程;
    • Coredump:终止进程并生成核心转储文件;
    • Ignore:忽略信号;
    • Stop:暂停进程;
    • Continue:继续运行进程。

信号嵌套处理

默认情况下,信号处理函数运行期间,如果再次接收到相同信号,信号会被自动阻塞,直到当前处理函数执行完毕。

信号使用

在日常开发或维护过程中,所涉及到信号的使用方式,主要是如何发送信号以及自定义程序的信号的处理行为。

信号发送

Linux系统使用kill系统调用向指定进程发送信号,原型定义如下:

 #include <sgnal.h> 
int kill(int pid, int sign);

kill函数的pid参数根据取值有多重含义:

  • pid>0:将此信号发送给进程ID为pid的进程;
  • pid=0:将此信号发送给进程组ID和该进程相同的进程;
  • pid<0:将此信号发送给进程组内进程ID为pid的进程;
  • pid=-1:将此信号发送给系统所有的进程。
kill命令

在Linux系统中,kill命令用于向进程发送信号,以终止或控制进程。默认情况下,kill命令发送的是SIGTERM(终止信号),这通常会让进程自行清理资源并优雅地终止。如果进程没有响应SIGTERM,可以使用SIGKILL(杀死信号)强制终止进程。

kill [-signum] [PID]

注册信号处理函数

Linux系统下可以通过signalsigaction函数可以注册信号处理函数。signal原型如下:

#include <signal.h>
void (*signal(int signum, void (*handler)(int)))(int);
sigaction是 signal的增强版,提供了更精细的控制,包括:
* 自定义信号处理函数
* 设置信号屏蔽字(阻塞其他信号)
* 指定信号处理标志(如是否自动重置处理函数)

sigaction函数原型定义如下:

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

信号安全与函数可重入性

信号安全是指线程在信号处理函数当中,不管以任何方式调用你的函数如果不死锁不修改数据,那就是信号安全的。在信号处理函数中应避免调用不可重入的函数(如 printf、malloc),否则可能导致程序崩溃。

可重入函数

一个函数或代码段若能在被中断后安全地再次调用(如信号处理函数中调用),则称为可重入的。不可重入的代码会导致数据损坏或死锁。
可重入代码的条件:

  1. 不使用全局或静态变量:依赖局部变量或通过参数传递状态。
  2. 不调用不可重入函数:如malloc()、printf()、非线程安全的库函数。
  3. 避免锁的嵌套:信号处理函数中不应获取锁(可能引发死锁)。
    在这里插入图片描述

线程安全与可重入性

可重入函数是线程安全函数的一个真子集。可重入函数一定是线程安全的。尽管线程安全和可重入有时会被不正确地用作同义词,但它们之间有清晰的技术差别。线程安全函数可能使用同步机制(如锁)来保护共享数据,而可重入函数则完全不使用共享数据。

相关参考

  • 《Unix环境高级编程》
  • Linux signal 图文详解(一)信号简介、信号注册
  • 干货】linux内核信号的处理过程

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

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

相关文章

【学习K230-例程19】GT6700-TCP-Client

B站视频 TCP TCP/IP&#xff08;Transmission Control Protocol/Internet Protocol&#xff0c;传输控制协议/网际协议&#xff09;是指能够在多个不同网络间实现信息传输的协议簇。TCP/IP 协议不仅仅指的是 TCP和 IP 两个协议&#xff0c;而是指一个由 FTP、SMTP、TCP、UDP、I…

o2oa待办流程和已办流程表

在o2oa系统中每个用户有两种唯一标识&#xff1a;第一种是姓名个人钉钉ID&#xff08;或者o2oa创建该用户时设置的id&#xff09;ORG_PERSON.xdistinguishedName刘准3013692136672430P第二种是姓名所在部门的钉钉id个人钉钉idORG_IDENTITY.xdistinguishedName刘准966488616_301…

QT零基础入门教程

基础篇第一章 QT 基础认知1.1 什么是 QT&#xff08;What&#xff09;​定义&#xff1a;跨平台 C 应用开发框架&#xff0c;不仅用于 UI 设计&#xff0c;还包含核心功能&#xff08;如事件、网络、数据库&#xff09;。​核心特性&#xff1a;​跨平台&#xff1a;一套代码支…

远程依赖管理新范式:cpolar赋能Nexus全球协作

文章目录 前言一. Docker安装Nexus二. 本地访问Nexus三. Linux安装Cpolar四. 配置Nexus界面公网地址五. 远程访问 Nexus界面六. 固定Nexus公网地址七. 固定地址访问Nexus 前言 Nexus作为一款企业级仓库管理工具&#xff0c;其核心功能在于集中管理各类软件依赖&#xff0c;提供…

Prompt技术深度解析:从基础原理到前沿应用的全面指南

引言 在人工智能技术飞速发展的今天&#xff0c;Prompt技术&#xff08;提示词工程&#xff09;已成为连接人类智慧与机器智能的重要桥梁。随着GPT-4、Claude、Gemini等大型语言模型的广泛应用&#xff0c;如何有效地与这些AI系统进行交互&#xff0c;已成为决定AI应用成功与否…

性能测试工具Jmeter之java.net.BindException: Address already in use

首先请参考连接&#xff1a;https://blog.csdn.net/weixin_46190208/article/details/115229733 。配置完注册表后一般就能解决问题。但并未解决我的问题 注册表的MaxUserPort&#xff0c;TcpTimedWaitDelay两个参数我只能配置MaxUserPort&#xff0c;设置TcpTimedWaitDelay后&…

JDK 新特性

JDK 新特性引入模块Java 9 开始引入了模块&#xff08;Module&#xff09;&#xff0c;目的是为了管理依赖。使用模块可以按需打包 JRE 和进一步限制类的访问权限。接口支持私有方法JAVA 9 开始&#xff0c;接口里可以添加私有方法&#xff0c;JAVA 8 对接口增加了默认方法的支…

如何高效应对网站反爬虫策略?

现在大型网站的反爬策略越来越高明了&#xff0c;不仅是对IP访问频率、User-Agent请求头进行异常识别&#xff0c;还会分析IP地址、浏览器指纹、JS动态加载、API逆向、行为模式等方式各种设卡&#xff0c;动不动跳出五花八门的验证码&#xff0c;非常难搞。 怎么应对反爬是个系…

c++ shared_ptr理解

不是一个智能指针对于一个计数器吗&#xff1f;怎么变成共有资源的计数器了&#xff1f;你的意思是多个对象共用一个计数器&#xff1f;你问到了 std::shared_ptr 最核心、最精妙的设计机制&#xff01;你的问题非常深刻&#xff1a;“不是一个智能指针对应一个计数器吗&#x…

002 Rust环境搭建

Rust环境搭建 现在很多集成开发环境(IDE)基本上都支持Rust开发。官方公布的支持工具&#xff1a;https://www.rust-lang.org/zh-CN/tools 这里以Windows 10 64位系统 Visual Studio Code为例来搭建Rust开发环境。 Rust安装 Rust 的编译工具依赖 C 语言的编译工具&#xff0…

【Unity进阶】Unity发布PC端,隐藏并自定义默认标题栏

开发环境&#xff1a; Unity2019.3.16f1c1 - 个人版 Visual Studio Community 2019 Windows10 专业版 x64嘿&#xff0c;各位朋友们&#xff01;当咱们欢欢喜喜地把项目打包成PC平台的exe窗口程序&#xff0c;准备在电脑上一展游戏风采时&#xff0c;却发现冒出来个Windows风格…

国产延时芯片EH3B05上电延时3秒开关机芯片方案超低功耗

EH3B05-4941-24A1延时开关芯片是一款专为低功耗电子产品设计的高效时序控制器件&#xff0c;其核心功能在于提供精确的多通道延时信号输出。该芯片采用SOT23-6超小封装&#xff0c;体积仅为2.9mm2.8mm1.3mm&#xff0c;特别适合空间受限的便携式设备。其工作电压范围覆盖2.0V至…

大数据与财务管理专业如何转型做金融科技?

在数字经济加速演进的今天&#xff0c;金融行业的边界正在被数据与技术重新定义。传统金融岗位正经历深刻变革&#xff0c;而"金融科技"&#xff08;FinTech&#xff09;作为技术与金融深度融合的产物&#xff0c;已成为行业转型升级的核心引擎。越来越多具备数据背景…

Windows、Linux 系统 nodejs 和 npm 版本更新及错误修复

一、推荐使用 nvm 工具&#xff0c;直接通过命令行安转和切换各个版本 无论是 Windows 平台&#xff0c;还是 Linux 平台&#xff0c;都推荐使用 nvm 工具。 nvm&#xff08;Node.js Version Management&#xff09;&#xff0c;是一个 nodejs 的版本管理工具。它是专门为解决…

【系列文章】Linux中的并发与竞争[03]-自旋锁

【系列文章】Linux中的并发与竞争[03]-自旋锁 该文章为系列文章&#xff1a;Linux中的并发与竞争中的第3篇 该系列的导航页连接&#xff1a; 【系列文章】Linux中的并发与竞争-导航页 文章目录【系列文章】Linux中的并发与竞争[03]-自旋锁一、自旋锁二、实验程序的编写2.1驱动…

开始 ComfyUI 的 AI 绘图之旅-Cosmos Predict2世界模型文生图(全网首发,官网都没有更新)(十三)

文章标题一、Cosmos-Predict21.Cosmos Predict2 Text2Image 工作流1.1 下载工作流文件1.2 手动模型安装1.3 按步骤完成工作流运行本文介绍了如何在 ComfyUI 中完成 Cosmos-Predict2 文生图的工作流 一、Cosmos-Predict2 Cosmos-Predict2 是由 NVIDIA 推出的新一代物理世界基础模…

深度学习优化器进化史:从SGD到AdamW的原理与选择

点击 “AladdinEdu&#xff0c;同学们用得起的【H卡】算力平台”&#xff0c;注册即送-H卡级别算力&#xff0c;80G大显存&#xff0c;按量计费&#xff0c;灵活弹性&#xff0c;顶级配置&#xff0c;学生更享专属优惠。 引言&#xff1a;优化器——深度学习的引擎 在深度学习…

工商业屋顶分布式光伏监控系统助力园区企业错峰有序用电

一、行业痛点与需求分析分布式光伏发电作为清洁能源的重要形式&#xff0c;近年来在工商业屋顶、户用场景中快速普及。然而&#xff0c;其“小而散”的特性导致电网适应性、运维效率、安全管控等方面面临显著挑战&#xff1a;1.电网适应性难题&#xff1a;高渗透率场景下&#…

华为初级认证培训需要吗?HCIA考试考什么内容?自学还是报班?

大家好&#xff0c;这里是G-LAB IT实验室。 在信息技术发展日新月异的今天&#xff0c;华为的ICT认证逐渐成为了行业内重要的技术标杆。而HCIA&#xff08;Huawei Certified ICT Associate&#xff09;作为华为初级认证&#xff0c;对于ICT技术从业者来说&#xff0c;既是职业发…

元宇宙与旅游产业:沉浸式体验重构旅行全流程

1 元宇宙重构旅游核心场景1.1 目的地体验&#xff1a;从 “实地观光” 到 “虚实融合深度探索”传统旅游目的地体验受限于时间、空间与物理条件&#xff0c;元宇宙通过 “数字孪生 超现实创作”&#xff0c;打造 “超越实地” 的沉浸式目的地体验。在文化遗产体验中&#xff0…