嵌入式Linux:信号是什么?
目录
1、信号的来源
2、信号的处理方式
3、信号的异步性
4、信号编号
信号是Linux系统中用于通知进程事件发生的一种机制,可以将其视为一种软件中断。信号类似于硬件中断,能够打断进程当前的执行流程,从而实现对中断机制的一种软件层面的模拟。信号的主要作用是处理异步事件,因为大多数情况下,信号的到达时间是不可预测的。
信号的一个主要目的是用于进程间的通信。具有合适权限的进程可以向另一个进程发送信号,这种用法不仅可以用作一种同步技术,还可以视为进程间通信(IPC)的最基础形式。
1、信号的来源
信号可以由多种情况触发,以下是常见的几种信号来源:
硬件异常
硬件检测到错误条件并通知内核,内核随即发送相应的信号给相关进程。例如,当执行除数为零、访问越界的内存等异常操作时,硬件会捕捉到这些错误并通知内核,内核则向相关进程发送信号,如SIGFPE(浮点异常)或SIGSEGV(非法内存访问)。
终端输入特殊字符
用户通过终端输入特定的控制字符可以产生信号。例如,按下CTRL + C组合键会产生SIGINT(中断信号),可以终止前台运行的进程;按下CTRL + Z会产生SIGTSTP(暂停信号),可暂停当前前台运行的进程。
进程调用系统调用
进程可以通过kill()系统调用向另一个进程或进程组发送信号。为了确保系统安全,发送信号的进程和接收信号的进程通常需要具有相同的所有者,或者发送信号的进程的所有者是root超级用户。
用户命令
用户可以通过kill命令向其它进程发送信号。虽然kill命令的名称听起来像是用来“杀死”进程,但实际上它可以发送任意信号。例如,kill -9 PID会向进程发送SIGKILL信号,强制终止指定进程。
软件事件
软件检测到特定条件发生时也会产生信号。这些条件可能包括:进程设置的定时器到期、进程使用的CPU时间超限、子进程退出等。这些信号通常由内核触发并发送给相关进程。
2、信号的处理方式
当信号到达进程时,进程需要对该信号进行处理。通常,进程对信号的处理方式有以下几种:
忽略信号
进程可以选择忽略某些信号,使其不对进程的执行产生影响。然而,有两种信号SIGKILL和SIGSTOP是无法被忽略的,因为它们提供了终止或停止进程的可靠方法。如果进程忽略某些由硬件异常产生的信号,其行为可能是未定义的。
捕获信号
进程可以捕获并处理信号,通过预先定义的信号处理函数来响应特定的信号。为了实现这一点,进程需要通过signal()或sigaction()系统调用来注册信号处理函数,当信号发生时,该函数将被执行以处理相应的事件。
执行系统默认操作
如果进程没有捕获信号,系统会对信号进行默认处理。对于大多数信号,系统默认的处理方式是终止进程。然而,也有些信号的默认处理方式是忽略。
3、信号的异步性
信号是异步事件的经典实例。信号的产生对进程而言是随机的,进程无法预测信号到达的具体时间。这种异步性与硬件中断非常相似。进程无法通过简单的变量测试或系统调用判断信号是否产生,只有当信号实际发生时,系统才会通知进程,打断当前执行流程,跳转到信号处理函数去执行相应操作。
4、信号编号
在Linux系统中,信号本质上是int类型的数字编号,类似于硬件中断所对应的中断号。内核为每一个信号定义了一个唯一的整数编号,这些编号从数字1开始依次展开。每个信号都有一个对应的名字,这个名字实际上是一个宏,通常以SIGxxx的形式出现,例如SIGINT、SIGKILL等。
信号的整数编号与其符号名之间是一一对应的关系,但由于不同操作系统的实现可能存在差异,某些信号的实际编号在不同系统中可能会有所不同。为了提高程序的可移植性,在编写代码时,开发者通常使用信号的符号名而不是直接使用编号。例如,在程序中使用SIGINT来表示中断信号,而不是直接使用数字2(在大多数系统中,SIGINT的编号为2)。
信号的定义可以在<signal.h>或<signum.h>头文件中找到,这些文件中定义了所有标准信号的编号和名称。
需要注意,信号编号从1开始,而编号为0的信号在标准定义中并不存在。
#define SIGHUP 1 /* 挂断 (POSIX). */
#define SIGINT 2 /* 中断 (ANSI). */
#define SIGQUIT 3 /* 退出 (POSIX). */
#define SIGILL 4 /* 非法指令 (ANSI). */
#define SIGTRAP 5 /* 跟踪陷阱 (POSIX). */
#define SIGABRT 6 /* 异常终止 (ANSI). */
#define SIGIOT 6 /* IOT 陷阱 (4.2 BSD). */
#define SIGBUS 7 /* 总线错误 (4.2 BSD). */
#define SIGFPE 8 /* 浮点异常 (ANSI). */
#define SIGKILL 9 /* 终止,无法阻塞 (POSIX). */
#define SIGUSR1 10 /* 用户自定义信号 1 (POSIX). */
#define SIGSEGV 11 /* 段错误 (ANSI). */
#define SIGUSR2 12 /* 用户自定义信号 2 (POSIX). */
#define SIGPIPE 13 /* 管道破裂 (POSIX). */
#define SIGALRM 14 /* 闹钟信号 (POSIX). */
#define SIGTERM 15 /* 终止 (ANSI). */
#define SIGSTKFLT 16 /* 栈错误. */
#define SIGCHLD 17 /* 子进程状态改变 (POSIX). */
#define SIGCLD SIGCHLD /* 与 SIGCHLD 相同 (System V). */
#define SIGCONT 18 /* 继续执行 (POSIX). */
#define SIGSTOP 19 /* 停止,无法阻塞 (POSIX). */
#define SIGTSTP 20 /* 终端停止信号 (POSIX). */
#define SIGTTIN 21 /* 后台从终端读取 (POSIX). */
#define SIGTTOU 22 /* 后台向终端写入 (POSIX). */
#define SIGURG 23 /* 套接字紧急情况 (4.2 BSD). */
#define SIGXCPU 24 /* 超过 CPU 时间限制 (4.2 BSD). */
#define SIGXFSZ 25 /* 超过文件大小限制 (4.2 BSD). */
#define SIGVTALRM 26 /* 虚拟时钟信号 (4.2 BSD). */
#define SIGPROF 27 /* 程序执行时钟信号 (4.2 BSD). */
#define SIGWINCH 28 /* 窗口大小改变 (4.3 BSD, Sun). */
#define SIGPOLL SIGIO /* 可轮询事件发生 (System V). */
#define SIGIO 29 /* I/O 操作完成 (4.2 BSD). */
#define SIGPWR 30 /* 电源故障重启 (System V). */
#define SIGSYS 31 /* 错误的系统调用. */
#define SIGUNUSED 31 /* 未使用的信号. */
在 Linux 系统下使用"kill -l"命令可查看到所有信号,如下所示:

在实际开发中,合理使用信号处理机制可以提高程序的健壮性和响应速度。开发者需要根据应用场景选择合适的信号处理方式,比如在关键任务中确保某些信号能够及时处理,或者在某些情况下忽略不重要的信号以避免不必要的中断。
相关文章:
嵌入式Linux:信号是什么?
目录 1、信号的来源 2、信号的处理方式 3、信号的异步性 4、信号编号 信号是Linux系统中用于通知进程事件发生的一种机制,可以将其视为一种软件中断。信号类似于硬件中断,能够打断进程当前的执行流程,从而实现对中断机制的一种软件层面的…...
教你搭建一个wifi贴系统
大家好,我是鲸天科技千千,大家都知道我是做小程序开发的,平时会给大家分享一些互联网相关的创业项目,感兴趣的可以跟我关注一下。 搭建一个首先就是要搭建一个自己的wifi贴小程序,我们自己的工作就是把这个小程序推广…...
C#中的LINQ语句
LINQ(Language Integrated Query)是 .NET Framework 中的一个功能强大的查询语言,它允许开发者使用类似 SQL 的语法来查询和操作数据。在 C# 中,LINQ 可以用于查询数组、列表、集合、XML 文档、关系数据库等。以下是一些常见的 LI…...
【C++】——string(模拟实现)
文章目录 string类构造string类拷贝构造string类析构string类运算符重载string类部分常用接口的模拟实现 这篇博客中构造、拷贝构造、析构、还有一些短小频繁调用的函数就不用做函数和定义分离,因为在类中,这种函数会默认是内联函数 string类构造 构造函…...
c++20 std::format 格式化说明
在标头<format>定义 ()功能很强大,它把字符串当成一个模板,通过传入的参数进行格式化,并且使用大括号‘{}’作为特殊字符代替‘%’。 1、基本用法 (1)不带编号,即“{}”(2)带…...
HTB-Unified(log4j2漏洞、MongoDb替换管理员密码)
前言 各位师傅大家好,我是qmx_07,今天给大家讲解Unified靶机 渗透过程 信息搜集 服务器开放了SSH服务,HTTP服务 访问网站 验证log4j2漏洞 8443端口:UniFi 网络 ,访问查询 是否有Nday漏洞利用 可以观察到UniFi的版…...
每天五分钟深度学习PyTorch:不同的神经网络层设置不同的学习率
本文重点 我们前面学习了基本网络模型的搭建,获取网络模型的子结构,以及优化器optim,我们发现我们设置优化器的时候,是对整个模型设置的,也就是说整个模型的参数学习率是一样,本节课程我们学习如何给不同的网络层设置不同的学习率。主要还是通过优化器optim来实现的,本…...
【渗透测试】——DVWA靶场搭建
📖 前言:DVWA(Damn Vulnerable Web Application)是一个用于安全漏洞测试的 PHP/MySQL 网络应用,旨在为安全专业人士提供一个合法的环境,以测试他们的技能和工具,同时帮助 Web 开发者更好地理解 …...
国内人工智能产业发展现状及对策研究
一、引言 人工智能作为新时代科技革命和产业变革的核心力量,正深刻改变着全球经济格局。我国政府高度重视人工智能产业发展,将其列为国家战略性新兴产业。在此背景下,本文旨在分析我国人工智能产业发展现状,探讨面临的挑战&#x…...
完整版订单超时自动取消功能
前几天对实习还是继续学习技术产生了抉择,问了一个前辈,他抛给我一个问题,怎么做15分钟订单自动取消,我说然后到时间之后,自动执行这个订单关闭业务,比如把锁了的库存给解开等等操作,然后在数据…...
算法刷题:300. 最长递增子序列、674. 最长连续递增序列、718. 最长重复子数组、1143. 最长公共子序列
300. 最长递增子序列 1.dp定义:dp[i]表示i之前包括i的以nums[i]结尾的最长递增子序列的长度 2.递推公式:if (nums[i] > nums[j]) dp[i] max(dp[i], dp[j] 1); 注意这里不是要dp[i] 与 dp[j] 1进行比较,而是我们要取dp[j] 1的最大值…...
go 笔记
数据结构与 方法(增删改查) 安装goland,注意版本是2024.1.1,不是2024.2.1,软件下载地址也在链接中提供了 ‘go’ 不是内部或外部命令,也不是可运行的程序 或批处理文件。 在 Windows 搜索栏中输入“环境变量”&#…...
路由等保测评
1.身份鉴别 应对登录的用户进行身份标识和鉴别, 身份标识具有唯一性,身份鉴别信息具有复杂度要求并定期更换。 可以使用“ service password-encryption"命令对存储在配置文件中的所有口令和类似数据进行加密, 以避免攻击者通过读取配…...
C# 反射之动态生成dll/exe
这个可能应该属于反射的高级使用范围了,平常在项目中使用的人估计也不是很多。由于使用反射的话会降低性能,比如之前用到的GetValue、SetValue等之类,但是使用这种方式会大大提高效率,在这里我只想说,都直接写IL指令了…...
Rust 所有权 Slices
文章目录 发现宝藏1. Slice 的基础知识1.1 什么是 Slice?1.2 如何创建 Slice? 2. 处理字符串 Slice2.1 字符串的 Slice2.2 字符串的 Unicode 和切片 3. 在函数中使用 Slice3.1 传递 Slice 给函数3.2 可变 Slice 的函数 4. 复杂示例4.1 处理多维数组的 Sl…...
windows 安全与网络管理问题
问题:当编写的脚本或程序运行的时候,可能被windows阻止访问网络甚至被删除 避免被删除 wini 进入设置界面 -> 选择更新与安全 -> 选择windwos defender -> 点击添加排除项,将指定的文件或目录排除,避免被软件删除 允许…...
基于Python实现一个庆祝国庆节的小程序
功能: 添加互动功能:允许用户选择不同的祝福语或者查询不同的国庆节信息。动态背景音乐:播放国庆节相关的背景音乐。增加节日小测验:提供一些关于国庆节的趣味小测验,让用户参与。增强图形用户界面 (GUI):…...
Anaconda 安装与使用教程
Anaconda 安装与使用教程 介绍 Anaconda 是一个用于科学计算的 Python 和 R 的发行版,它包含了众多流行的科学计算、数据分析、机器学习等领域的库。本教程旨在帮助初学者快速上手 Anaconda,并学会如何使用其管理环境以及安装包。 第一步:…...
时序预测SARIMAX模型
1. 项目背景 本文基于kaggle平台相关竞赛项目,具体连接如下: Time Series Forecasting With SARIMAX 基本信息如内容说明、数据集、已提交代码、当前得分排名以及比赛规则等,如图【1】所示,可以认真阅读。 图 1 2. 数据读取 …...
gin集成jaeger中间件实现链路追踪
1. 背景 新业务线带来新项目启动,需要改进原有项目的基础框架和组件能力,以提升后续开发和维护效率。项目搭建主要包括技术选型、框架搭建、基础服务搭建等。这其中就涉及到链路追踪的内容,结合其中的踩坑情况,用一篇文章来说明完…...
多云管理“拦路虎”:深入解析网络互联、身份同步与成本可视化的技术复杂度
一、引言:多云环境的技术复杂性本质 企业采用多云策略已从技术选型升维至生存刚需。当业务系统分散部署在多个云平台时,基础设施的技术债呈现指数级积累。网络连接、身份认证、成本管理这三大核心挑战相互嵌套:跨云网络构建数据…...
国防科技大学计算机基础课程笔记02信息编码
1.机内码和国标码 国标码就是我们非常熟悉的这个GB2312,但是因为都是16进制,因此这个了16进制的数据既可以翻译成为这个机器码,也可以翻译成为这个国标码,所以这个时候很容易会出现这个歧义的情况; 因此,我们的这个国…...
C++_核心编程_多态案例二-制作饮品
#include <iostream> #include <string> using namespace std;/*制作饮品的大致流程为:煮水 - 冲泡 - 倒入杯中 - 加入辅料 利用多态技术实现本案例,提供抽象制作饮品基类,提供子类制作咖啡和茶叶*//*基类*/ class AbstractDr…...
K8S认证|CKS题库+答案| 11. AppArmor
目录 11. AppArmor 免费获取并激活 CKA_v1.31_模拟系统 题目 开始操作: 1)、切换集群 2)、切换节点 3)、切换到 apparmor 的目录 4)、执行 apparmor 策略模块 5)、修改 pod 文件 6)、…...
中南大学无人机智能体的全面评估!BEDI:用于评估无人机上具身智能体的综合性基准测试
作者:Mingning Guo, Mengwei Wu, Jiarun He, Shaoxian Li, Haifeng Li, Chao Tao单位:中南大学地球科学与信息物理学院论文标题:BEDI: A Comprehensive Benchmark for Evaluating Embodied Agents on UAVs论文链接:https://arxiv.…...
Debian系统简介
目录 Debian系统介绍 Debian版本介绍 Debian软件源介绍 软件包管理工具dpkg dpkg核心指令详解 安装软件包 卸载软件包 查询软件包状态 验证软件包完整性 手动处理依赖关系 dpkg vs apt Debian系统介绍 Debian 和 Ubuntu 都是基于 Debian内核 的 Linux 发行版ÿ…...
【第二十一章 SDIO接口(SDIO)】
第二十一章 SDIO接口 目录 第二十一章 SDIO接口(SDIO) 1 SDIO 主要功能 2 SDIO 总线拓扑 3 SDIO 功能描述 3.1 SDIO 适配器 3.2 SDIOAHB 接口 4 卡功能描述 4.1 卡识别模式 4.2 卡复位 4.3 操作电压范围确认 4.4 卡识别过程 4.5 写数据块 4.6 读数据块 4.7 数据流…...
MMaDA: Multimodal Large Diffusion Language Models
CODE : https://github.com/Gen-Verse/MMaDA Abstract 我们介绍了一种新型的多模态扩散基础模型MMaDA,它被设计用于在文本推理、多模态理解和文本到图像生成等不同领域实现卓越的性能。该方法的特点是三个关键创新:(i) MMaDA采用统一的扩散架构…...
Rust 异步编程
Rust 异步编程 引言 Rust 是一种系统编程语言,以其高性能、安全性以及零成本抽象而著称。在多核处理器成为主流的今天,异步编程成为了一种提高应用性能、优化资源利用的有效手段。本文将深入探讨 Rust 异步编程的核心概念、常用库以及最佳实践。 异步编程基础 什么是异步…...
涂鸦T5AI手搓语音、emoji、otto机器人从入门到实战
“🤖手搓TuyaAI语音指令 😍秒变表情包大师,让萌系Otto机器人🔥玩出智能新花样!开整!” 🤖 Otto机器人 → 直接点明主体 手搓TuyaAI语音 → 强调 自主编程/自定义 语音控制(TuyaAI…...
