嵌入式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. 背景 新业务线带来新项目启动,需要改进原有项目的基础框架和组件能力,以提升后续开发和维护效率。项目搭建主要包括技术选型、框架搭建、基础服务搭建等。这其中就涉及到链路追踪的内容,结合其中的踩坑情况,用一篇文章来说明完…...

前端层面----监控与埋点
前言: 站在产品的视角,经常会问如下几个问题: 产品有没有用户使用 用户用得怎么样 系统会不会经常出现异常 如何更好地满足用户需求服务用户 当站在技术视角时,经常会问如下几个问题: 系统出现异常的频率如何 异常…...

linux Command
linux Command 1. 系统监控命令 1.1 top top [param] top -H -p pid,查看进程pid下面的子线程。-b以处理模式操作-c显示完整的命令行而不只是显示命令名。-d 屏幕刷新间隔时间。-l 忽略失效过程。-s 保密模式。-S 累积模式。-u 【用户名】 指定用户名。-p 【进程…...

uniapp登录页面( 适配:pc、小程序、h5)
<!-- 简洁登录页面 --> <template><view class"login-bg"><image class"img-a" src"https://zhoukaiwen.com/img/loginImg/2.png"></image><image class"img-b" src"https://zhoukaiwen.com/im…...

关于OceanBase 多模一体化的浅析
在当今多元化的业务生态中,各行各业对数据库系统的需求各有侧重。举例来说,金融风控领域对数据库的高效事务处理(TP)和分析处理(AP)能力有着严格要求;游戏行业则更加注重文档数据库的灵活性和性…...

快速git
下载 sudo apt install git配置 $ git config --global user.name "John Doe" $ git config --global user.email johndoeexample.com没有空格可以不加双引号如果~/.ssh没有先创建(下一步用) ssh方式制作密钥 github解释 #以邮箱作为标签…...

欺诈文本分类检测(十四):GPTQ量化模型
1. 引言 量化的本质:通过将模型参数从高精度(例如32位)降低到低精度(例如8位),来缩小模型体积。 本文将采用一种训练后量化方法GPTQ,对前文已经训练并合并过的模型文件进行量化,通…...

2024.9.14(RC和RS)
一、replicationcontroller (RC) 1、更改镜像站 [rootk8s-master ~]# vim /etc/docker/daemon.json {"registry-mirrors": ["https://do.nark.eu.org","https://dc.j8.work","https://docker.m.daocloud.io",&…...

【算法随想录04】KMP 字符串匹配算法
这是字符串模式匹配经典算法。 给定一个文本 t 和一个字符串 s,我们尝试找到并展示 s 在 t 中的所有出现(occurrence)。 #include<bits/stdc.h>using namespace std;vector<int> KMP(string s) {int n s.size();vector<int&g…...

TCP和MQTT通信协议
协议分层 网络分层 协议应用层 Co AP MQTT HTTP传输层 UDP TCP网络层 IP链路层 Enternet 网络分层中最…...

Python Pickle 与 JSON 序列化详解:存储、反序列化与对比
Python Pickle 与 JSON 序列化详解:存储、反序列化与对比 文章目录 Python Pickle 与 JSON 序列化详解:存储、反序列化与对比一 功能总览二 Pickle1 应用2 序列化3 反序列化4 系统资源对象1)不能被序列化的系统资源对象2)强行序列…...