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

嵌入式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、信号的处理方式

当信号到达进程时,进程需要对该信号进行处理。通常,进程对信号的处理方式有以下几种:

忽略信号
进程可以选择忽略某些信号,使其不对进程的执行产生影响。然而,有两种信号SIGKILLSIGSTOP是无法被忽略的,因为它们提供了终止或停止进程的可靠方法。如果进程忽略某些由硬件异常产生的信号,其行为可能是未定义的。

捕获信号
进程可以捕获并处理信号,通过预先定义的信号处理函数来响应特定的信号。为了实现这一点,进程需要通过signal()sigaction()系统调用来注册信号处理函数,当信号发生时,该函数将被执行以处理相应的事件。

执行系统默认操作
如果进程没有捕获信号,系统会对信号进行默认处理。对于大多数信号,系统默认的处理方式是终止进程。然而,也有些信号的默认处理方式是忽略。

3、信号的异步性

信号是异步事件的经典实例。信号的产生对进程而言是随机的,进程无法预测信号到达的具体时间。这种异步性与硬件中断非常相似。进程无法通过简单的变量测试或系统调用判断信号是否产生,只有当信号实际发生时,系统才会通知进程,打断当前执行流程,跳转到信号处理函数去执行相应操作。

4、信号编号

在Linux系统中,信号本质上是int类型的数字编号,类似于硬件中断所对应的中断号。内核为每一个信号定义了一个唯一的整数编号,这些编号从数字1开始依次展开。每个信号都有一个对应的名字,这个名字实际上是一个宏,通常以SIGxxx的形式出现,例如SIGINTSIGKILL等。

信号的整数编号与其符号名之间是一一对应的关系,但由于不同操作系统的实现可能存在差异,某些信号的实际编号在不同系统中可能会有所不同。为了提高程序的可移植性,在编写代码时,开发者通常使用信号的符号名而不是直接使用编号。例如,在程序中使用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系统中用于通知进程事件发生的一种机制&#xff0c;可以将其视为一种软件中断。信号类似于硬件中断&#xff0c;能够打断进程当前的执行流程&#xff0c;从而实现对中断机制的一种软件层面的…...

教你搭建一个wifi贴系统

大家好&#xff0c;我是鲸天科技千千&#xff0c;大家都知道我是做小程序开发的&#xff0c;平时会给大家分享一些互联网相关的创业项目&#xff0c;感兴趣的可以跟我关注一下。 搭建一个首先就是要搭建一个自己的wifi贴小程序&#xff0c;我们自己的工作就是把这个小程序推广…...

C#中的LINQ语句

LINQ&#xff08;Language Integrated Query&#xff09;是 .NET Framework 中的一个功能强大的查询语言&#xff0c;它允许开发者使用类似 SQL 的语法来查询和操作数据。在 C# 中&#xff0c;LINQ 可以用于查询数组、列表、集合、XML 文档、关系数据库等。以下是一些常见的 LI…...

【C++】——string(模拟实现)

文章目录 string类构造string类拷贝构造string类析构string类运算符重载string类部分常用接口的模拟实现 这篇博客中构造、拷贝构造、析构、还有一些短小频繁调用的函数就不用做函数和定义分离&#xff0c;因为在类中&#xff0c;这种函数会默认是内联函数 string类构造 构造函…...

c++20 std::format 格式化说明

在标头<format>定义 ()功能很强大&#xff0c;它把字符串当成一个模板&#xff0c;通过传入的参数进行格式化&#xff0c;并且使用大括号‘{}’作为特殊字符代替‘%’。 1、基本用法 &#xff08;1&#xff09;不带编号&#xff0c;即“{}”&#xff08;2&#xff09;带…...

HTB-Unified(log4j2漏洞、MongoDb替换管理员密码)

前言 各位师傅大家好&#xff0c;我是qmx_07&#xff0c;今天给大家讲解Unified靶机 渗透过程 信息搜集 服务器开放了SSH服务&#xff0c;HTTP服务 访问网站 验证log4j2漏洞 8443端口&#xff1a;UniFi 网络 &#xff0c;访问查询 是否有Nday漏洞利用 可以观察到UniFi的版…...

每天五分钟深度学习PyTorch:不同的神经网络层设置不同的学习率

本文重点 我们前面学习了基本网络模型的搭建,获取网络模型的子结构,以及优化器optim,我们发现我们设置优化器的时候,是对整个模型设置的,也就是说整个模型的参数学习率是一样,本节课程我们学习如何给不同的网络层设置不同的学习率。主要还是通过优化器optim来实现的,本…...

【渗透测试】——DVWA靶场搭建

&#x1f4d6; 前言&#xff1a;DVWA&#xff08;Damn Vulnerable Web Application&#xff09;是一个用于安全漏洞测试的 PHP/MySQL 网络应用&#xff0c;旨在为安全专业人士提供一个合法的环境&#xff0c;以测试他们的技能和工具&#xff0c;同时帮助 Web 开发者更好地理解 …...

国内人工智能产业发展现状及对策研究

一、引言 人工智能作为新时代科技革命和产业变革的核心力量&#xff0c;正深刻改变着全球经济格局。我国政府高度重视人工智能产业发展&#xff0c;将其列为国家战略性新兴产业。在此背景下&#xff0c;本文旨在分析我国人工智能产业发展现状&#xff0c;探讨面临的挑战&#x…...

完整版订单超时自动取消功能

前几天对实习还是继续学习技术产生了抉择&#xff0c;问了一个前辈&#xff0c;他抛给我一个问题&#xff0c;怎么做15分钟订单自动取消&#xff0c;我说然后到时间之后&#xff0c;自动执行这个订单关闭业务&#xff0c;比如把锁了的库存给解开等等操作&#xff0c;然后在数据…...

算法刷题:300. 最长递增子序列、674. 最长连续递增序列、718. 最长重复子数组、1143. 最长公共子序列

300. 最长递增子序列 1.dp定义&#xff1a;dp[i]表示i之前包括i的以nums[i]结尾的最长递增子序列的长度 2.递推公式&#xff1a;if (nums[i] > nums[j]) dp[i] max(dp[i], dp[j] 1); 注意这里不是要dp[i] 与 dp[j] 1进行比较&#xff0c;而是我们要取dp[j] 1的最大值…...

go 笔记

数据结构与 方法&#xff08;增删改查&#xff09; 安装goland,注意版本是2024.1.1&#xff0c;不是2024.2.1&#xff0c;软件下载地址也在链接中提供了 ‘go’ 不是内部或外部命令&#xff0c;也不是可运行的程序 或批处理文件。 在 Windows 搜索栏中输入“环境变量”&#…...

路由等保测评

1.身份鉴别 应对登录的用户进行身份标识和鉴别&#xff0c; 身份标识具有唯一性&#xff0c;身份鉴别信息具有复杂度要求并定期更换。 可以使用“ service password-encryption"命令对存储在配置文件中的所有口令和类似数据进行加密&#xff0c; 以避免攻击者通过读取配…...

C# 反射之动态生成dll/exe

这个可能应该属于反射的高级使用范围了&#xff0c;平常在项目中使用的人估计也不是很多。由于使用反射的话会降低性能&#xff0c;比如之前用到的GetValue、SetValue等之类&#xff0c;但是使用这种方式会大大提高效率&#xff0c;在这里我只想说&#xff0c;都直接写IL指令了…...

Rust 所有权 Slices

文章目录 发现宝藏1. Slice 的基础知识1.1 什么是 Slice&#xff1f;1.2 如何创建 Slice&#xff1f; 2. 处理字符串 Slice2.1 字符串的 Slice2.2 字符串的 Unicode 和切片 3. 在函数中使用 Slice3.1 传递 Slice 给函数3.2 可变 Slice 的函数 4. 复杂示例4.1 处理多维数组的 Sl…...

windows 安全与网络管理问题

问题&#xff1a;当编写的脚本或程序运行的时候&#xff0c;可能被windows阻止访问网络甚至被删除 避免被删除 wini 进入设置界面 -> 选择更新与安全 -> 选择windwos defender -> 点击添加排除项&#xff0c;将指定的文件或目录排除&#xff0c;避免被软件删除 允许…...

基于Python实现一个庆祝国庆节的小程序

功能&#xff1a; 添加互动功能&#xff1a;允许用户选择不同的祝福语或者查询不同的国庆节信息。动态背景音乐&#xff1a;播放国庆节相关的背景音乐。增加节日小测验&#xff1a;提供一些关于国庆节的趣味小测验&#xff0c;让用户参与。增强图形用户界面 (GUI)&#xff1a;…...

Anaconda 安装与使用教程

Anaconda 安装与使用教程 介绍 Anaconda 是一个用于科学计算的 Python 和 R 的发行版&#xff0c;它包含了众多流行的科学计算、数据分析、机器学习等领域的库。本教程旨在帮助初学者快速上手 Anaconda&#xff0c;并学会如何使用其管理环境以及安装包。 第一步&#xff1a;…...

时序预测SARIMAX模型

1. 项目背景 本文基于kaggle平台相关竞赛项目&#xff0c;具体连接如下&#xff1a; Time Series Forecasting With SARIMAX 基本信息如内容说明、数据集、已提交代码、当前得分排名以及比赛规则等&#xff0c;如图【1】所示&#xff0c;可以认真阅读。 图 1 2. 数据读取 …...

gin集成jaeger中间件实现链路追踪

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

Ostrakon-VL-8B开箱即用:Gradio Web UI直连7860端口,无前端开发成本

Ostrakon-VL-8B开箱即用&#xff1a;Gradio Web UI直连7860端口&#xff0c;无前端开发成本 1. 引言&#xff1a;让视觉理解像聊天一样简单 想象一下&#xff0c;你是一家连锁餐饮店的运营经理&#xff0c;每天需要查看几十家门店后厨的监控照片&#xff0c;检查卫生状况和食…...

UNIT-00与Git工作流集成:智能提交信息生成与代码审查

UNIT-00与Git工作流集成&#xff1a;智能提交信息生成与代码审查 1. 引言 你有没有过这样的经历&#xff1f;项目临近上线&#xff0c;需要回溯某个功能修改的原因&#xff0c;结果发现提交记录里全是“fix bug”、“update”这样毫无信息量的描述&#xff0c;根本想不起来当…...

QTQK-FJYJNDL-V137 远动及光伏群调群控装置技术介绍

一、产品概述QTQK-FJYJNDL-V137 群调群控装置由福建亿捷能电力科技公司自主研发&#xff0c;主要应用于光伏电站、风电场、储能电站、配电站等各类分布式电源场景&#xff0c;是一款专用的边缘计算与调控设备。该装置可实现现场测控装置、保护装置、逆变器、储能变流器等设备的…...

OpenClaw监控方案:Qwen3-4B模型API健康检查自动化

OpenClaw监控方案&#xff1a;Qwen3-4B模型API健康检查自动化 1. 为什么需要模型API监控 上周我的个人自动化流程突然中断了整整8小时——直到第二天早上查看日志才发现是Qwen3-4B模型API服务崩溃了。这个教训让我意识到&#xff1a;本地部署的大模型也需要像云服务一样建立健…...

新手必看!Qwen3-4B-Instruct-2507从部署到对话:vLLM+Chainlit全步骤解析

新手必看&#xff01;Qwen3-4B-Instruct-2507从部署到对话&#xff1a;vLLMChainlit全步骤解析 1. 模型介绍与准备工作 1.1 Qwen3-4B-Instruct-2507核心优势 Qwen3-4B-Instruct-2507是阿里巴巴推出的轻量级大语言模型&#xff0c;专为指令跟随任务优化。相比前代版本&#x…...

AI Agent创业商业模式:订阅制、按需付费、定制化服务的选择

AI Agent创业商业模式&#xff1a;订阅制、按需付费、定制化服务的选择1. 标题 (Title) 从工具价值到商业闭环&#xff1a;AI Agent创业的三大核心盈利模式深度拆解与选择指南AI Agent创业避坑指南&#xff1a;订阅制、按需付费、定制化服务的优劣势、适配场景与ROI计算全解析不…...

如何在 SvelteKit 中为动态加载的图片实现响应式悬停覆盖层

本文讲解如何在 sveltekit 中正确实现动态图片的鼠标悬停交互&#xff08;如显示标题/描述覆盖层&#xff09;&#xff0c;避免直接操作 dom&#xff0c;推荐使用响应式状态绑定与组件化方案提升可维护性与编译兼容性。 本文讲解如何在 sveltekit 中正确实现动态图片的鼠标…...

3步搞定OpenClaw镜像体验:Kimi-VL-A3B-Thinking云端沙盒部署

3步搞定OpenClaw镜像体验&#xff1a;Kimi-VL-A3B-Thinking云端沙盒部署 1. 为什么选择云端沙盒体验OpenClaw 作为一个长期在本地折腾各种AI工具的技术爱好者&#xff0c;我深刻理解配置环境的痛苦。记得第一次尝试在MacBook上部署OpenClaw时&#xff0c;光是解决Node.js版本…...

PCB丝印设计规范与Altium高效调整技巧

1. PCB丝印调整的必要性与基本原则 在PCB设计流程中&#xff0c;丝印位号的调整往往被初学者视为"收尾工作"而草率处理。但作为有十年Layout经验的工程师&#xff0c;我必须强调&#xff1a;规范的丝印设计能提升30%以上的装配效率&#xff0c;特别是对于需要手工焊接…...

避坑指南:OpenClaw安装Qwen3.5-9B常见的5个配置错误

避坑指南&#xff1a;OpenClaw安装Qwen3.5-9B常见的5个配置错误 1. 为什么需要这篇指南 上周我在本地部署OpenClaw对接Qwen3.5-9B时&#xff0c;经历了从满怀期待到崩溃边缘的全过程。本以为按照官方文档就能轻松搞定&#xff0c;结果在npm权限、端口冲突、模型地址配置等环节…...