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

一篇文章带你快速了解linux中关于信号的核心内容

1. 信号概念

信号是操作系统用来通知进程某个特定事件已经发生的一种方式。它们是一种软件中断,可以被发送到进程以对其进行异步通知。

2. 信号处理的三种方式

  1. 执行默认动作
  2. 执行自定义动作
  3. 忽略

signal() 函数:将信号处理设置为 SIG_IGN,可以忽略信号

signal(sig, SIG_IGN);

sigaction() 函数:将 sa_handler 设置为 SIG_IGN

struct sigaction act;
act.sa_handler = SIG_IGN;
sigemptyset(&act.sa_mask);
act.sa_flags = 0;
sigaction(sig, &act, NULL);

3. 系统定义的信号列表

131表示为常规信号,3264表示为实时信号

常规信号不需要排队,实时信号需要排队。

如果一个常规信号在短时间内多次产生,而进程正在处理前一个该信号,那么后续的相同信号通常会被丢弃,只保证至少有一个信号被传递给进程。

如果有多个相同的实时信号发送给一个进程,它们会被排队,直到进程有机会处理它们。这意味着进程可以按顺序处理所有接收到的实时信号,不会丢失任何信号。

信号编号信号名词信号用途
1SIGHUP通常在控制终端关闭时发送给前台进程组的所有进程,用于提示程序重新读取配置文件或优雅地重启
2SIGINT由用户发送,通常通过按下 Ctrl+C,请求程序中断当前操作
3SIGQUIT由用户发送,通常通过按下 Ctrl+\,请求程序停止并产生核心转储,用于调试
4SIGILL当程序尝试执行非法指令时发送,指示程序存在严重错误
5SIGTRAP由断点指令或trace调用触发,用于调试
6SIGABRTabort() 函数调用触发,请求程序异常终止并产生核心转储
7SIGBUS当程序试图访问一个无法访问的内存地址时发送,指示总线错误
8SIGFPE浮点异常信号,如算术溢出、除以零等
9SIGKILL用于立即终止进程,无法被捕获或忽略
10SIGUSR1用户自定义信号,可以用于进程间通信
11SIGSEGV段错误信号,当程序试图访问其内存空间中未分配或无法访问的内存时发送
12SIGUSR2用户自定义信号,可以用于进程间通信
13SIGPIPE当写入一个已被另一端关闭的管道时发送
14SIGALRM计时器信号,由 alarm() 函数设置的计时器超时触发
15SIGTERM终止信号,请求进程自行终止,是最常用的终止信号
16SIGSTKFLT协处理器栈故障,不常用
17SIGCHLD子进程结束或停止信号,用于通知父进程子进程的状态改变
18SIGCONT继续信号,用于将一个被停止的进程恢复执行
19SIGSTOP停止信号,用于暂停进程的执行,无法被捕获或忽略
20SIGTSTP用户停止信号,通常由用户通过 Ctrl+Z 触发
21SIGTTIN后台进程组试图从前台进程组控制的终端读取
22SIGTTOU后台进程组试图向前台进程组控制的终端写入
23SIGURG有紧急数据可读,通常用于网络编程
24SIGXCPUCPU时间限制超信号,当进程超过其CPU时间限制时发送
25SIGXFSZ文件大小限制超信号,当进程试图扩大超过其文件大小限制的文件时发送
26SIGVTALRM虚拟时钟超时信号,类似于 SIGALRM,但是计算的是进程占用 CPU 的时间
27SIGPROF性能分析信号,用于性能分析和监视
28SIGWINCH窗口变化信号,当终端的窗口大小发生变化时发送
29SIGIO输入/输出可用信号,用于异步I/O
30SIGPWR电源恢复信号,用于通知设备电源状态变化
31SIGSYS坏系统调用信号,当执行了无法识别的系统调用时发送

4. 信号的产生

4.1 通过终端按键产生信号

当用户在终端按键时(如 Ctrl+C 或 Ctrl+Z),终端驱动程序会捕捉到这个按键事件,并将其转换为相应的信号。

4.2 调用系统函向进程发信号

kill函数可以给一个指定的进程发送指定的信号

int kill(pid_t pid, int signo);//成功返回0,错误返回-1

raise函数可以给当前进程发送指定的信号(自己给自己发信号)

int raise(int signo);//成功返回0,错误返回-1

abort函数使当前进程接收到信号而异常终止

void abort(void);//abort函数总是会成功的,所以没有返回值

4.3 由软件条件产生信号

常见的软件条件:

  • 异常(SIGFPE、SIGSEGV)
  • 主动终止(SIGABRT)
  • 调试信息(SIGTRAP)
  • 自定义行为(SIGUSR1、SIGUSR2)

信号的生成和处理:

使用系统调用

#include <signal.h>
#include <stdio.h>
#include <stdlib.h>int main() {// 主动触发 SIGABRT 信号abort();return 0;
}

捕捉和处理

#include <signal.h>
#include <stdio.h>
#include <stdlib.h>void handle_sigint(int sig) {printf("Caught signal %d\n", sig);exit(0);
}int main() {signal(SIGINT, handle_sigint); // 捕获 Ctrl+Cwhile (1) {printf("Running...\n");sleep(1);}return 0;
}

4.4 硬件异常产生信号

在 Linux 中,硬件异常是指由计算机硬件引发的事件,这些事件通常会导致当前执行的程序无法继续正常运行。

硬件异常的常见问题:

非法指令:程序尝试执行未定义或不合法的指令

段错误:程序访问了未分配给它的内存区域

浮点异常:发生除以零、溢出等浮点运算错误

总线错误:由于对未对齐地址或无效地址进行访问而导致的错误

例如:

int main() {int *ptr = NULL;*ptr = 42; // 尝试写入 NULL 指针return 0;}

在这种情况下,CPU 检测到非法内存访问并生成 SIGSEGV 信号。操作系统捕获该信号并终止该进程,同时可能生成核心转储文件用于后续调试。

相关文章:

一篇文章带你快速了解linux中关于信号的核心内容

1. 信号概念 信号是操作系统用来通知进程某个特定事件已经发生的一种方式。它们是一种软件中断&#xff0c;可以被发送到进程以对其进行异步通知。 2. 信号处理的三种方式 执行默认动作执行自定义动作忽略 signal() 函数&#xff1a;将信号处理设置为 SIG_IGN&#xff0c;可…...

openEuler、Linux操作系统常见操作-(6)如何登录Linux

如何登录Linux Linux登陆方式主要有如下两种: 。本地登陆 。一个典型的Linux系统将运行六个虚拟控制台和一个图形控制台&#xff0c;openEuler目前暂未支持图形化界面; 可以通过CtrlAltF[1-6]在6个虚拟控制台之间进行切换。 远程登录 。默认情况下openEuler支持远程登录&…...

Python基础语法条件

注释 注释的作用 通过用自己熟悉的语言&#xff0c;在程序中对某些代码进行标注说明&#xff0c;这就是注释的作用&#xff0c;能够大大增强程序的可读性。 注释的分类及语法 注释分为两类&#xff1a;单行注释 和 多行注释。 单行注释 只能注释一行内容&#xff0c;语法如下…...

006-MAVEN 的使用

MAVEN 的使用 一、依赖范围二、依赖的传递性三、依赖的原则四、依赖的排除 一、依赖范围 在引入log4j 依赖的时候&#xff0c;有一个scope设置&#xff0c;这个scope设置的值就是对应的依赖范围(因为compile 是默认的依赖范围&#xff0c;所以有时也可以省略)。 Maven 提供了…...

npm使用时报错:Could not retrieve https://npm.taobao.org/mirrors/node/index.json.

在使用npm时报错&#xff0c;报错信息如下&#xff1a; 报错的原因&#xff1a;是原来的淘宝镜像地址过期了 解决办法&#xff1a;修改镜像地址。打开nvm的安装地址 -->settings.txt文件 -->配置下载源 1、将settings.txt文件中的 node_mirror: https://npm.taobao.or…...

软考中级网络工程师——高级配置

文章目录 IS-ISBGP(边境网关协议)-IBGP-EBGP配置BFD(双向转发侦测)与Router-Static联动BFD与OSPF联动BFD与VRRP(虚拟路由器冗余协议)联动VRRP配置(基于网关备份)FW基础配置FW高级配置DHCP路由策略 IS-IS 第一步&#xff1a;每一个路由设置环回口地址 第二部&#xff1a;配置接…...

Leetcode 第 141 场双周赛题解

Leetcode 第 141 场双周赛题解 Leetcode 第 141 场双周赛题解题目1&#xff1a;3314. 构造最小位运算数组 I思路代码复杂度分析 题目2&#xff1a;3315. 构造最小位运算数组 II思路代码复杂度分析 题目3&#xff1a;3316. 从原字符串里进行删除操作的最多次数思路代码复杂度分析…...

Linux性能调优,还可以从这些方面入手

linux是目前最常用的操作系统&#xff0c;下面是一些常见的 Linux 系统调优技巧&#xff0c;在进行系统调优时&#xff0c;需要根据具体的系统负载和应用需求进行调整&#xff0c;并进行充分的测试和监控&#xff0c;以确保系统的稳定性和性能。同时&#xff0c;调优过程中要谨…...

STM32的独立看门狗定时器(IWDG)技术介绍

在嵌入式系统中&#xff0c;确保系统的稳定性和可靠性至关重要。看门狗定时器&#xff08;Watchdog Timer, WDT&#xff09; 是一种常用的硬件机制&#xff0c;用于监控系统的运行状态&#xff0c;防止系统因软件故障或意外情况进入不可预期的状态。STM32系列微控制器提供了两种…...

自动化生成工作流?英伟达提出ComfyGen:通过LLM来匹配给定的文本提示与合适的工作流程

ComfyGen的核心在于通过LLM来匹配给定的文本提示与合适的工作流程。该方法从500个来自用户的多样化提示生成图像&#xff0c;随后使用一系列美学预测模型对生成结果进行评分。这些评分与相应的工作流程形成了一个训练集&#xff0c;包含提示、工作流程及其得分的三元组。 然后…...

indicatorTree-v10练习(有问题)

目标&#xff1a;设计数据库表表格式&#xff0c;将“indicatorTree-v10.json”导入到数据库&#xff0c;再从数据库读取写为JSON文件。 其他要求&#xff1a;数据库要求为mysql数据库&#xff1b;编程语言暂时限定为C&#xff1b;JSON解析使用本文件夹中的cJSON.c和cJSON.h&am…...

python源码:指定麦克风/音响播放歌曲

前言 我使用pygame实现了指定麦克风/音响播放歌曲的功能&#xff0c;主要目的是解决直播过程的多源声道控制问题。 代码 # 查看自己的音频设备 # 请记住目标音频设备的具体名称 import pygame as mixer import pygame._sdl2 as sdl2mixer.init() # Initialize the mixer, thi…...

基于华为云智慧生活生态链设计的智能鱼缸

一. 引言 1.1 项目背景 随着智能家居技术的发展和人们对高品质生活的追求日益增长&#xff0c;智能鱼缸作为一种结合了科技与自然美的家居装饰品&#xff0c;正逐渐成为智能家居领域的新宠。本项目旨在设计一款基于华为云智慧生活生态链的智能鱼缸&#xff0c;它不仅能够提供…...

OJ-1015图像物体的边界

分析 思路 1.输入读取&#xff1a;读取网格的维度(M&#xff0c;N)和像素值到一个二维数组中。 2.迭代:遍历二维数组中的每个单元格。 3.边界检测:对于每个像素值为1的单元格,检查其八个相邻的单元格。如果任何相邻单元格的像素值为5,则增加边界计数。 4,边界计数调整:由于每…...

RAG 入门实践:从文档拆分到向量数据库与问答构建

本文将使用 Transformers 和 LangChain&#xff0c;选择在 Retrieval -> Chinese 中表现较好的编码模型进行演示&#xff0c;即 chuxin-llm/Chuxin-Embedding。 你还将了解 RecursiveCharacterTextSplitter 的递归工作原理。 一份值得关注的基准测试榜单&#xff1a;MTEB (M…...

445: 选择问题

解法&#xff1a; 第k大的数据查找 a, b map(int, input().split()) l list(map(int, input().split())) l.sort() print(l[b-1])...

IP地址类型选择指南:动态IP、静态IP还是数据中心IP?

你是否曾经困惑于如何选择最适合业务需求的IP地址类型&#xff1f;面对动态IP、静态IP和数据中心IP这三种选择&#xff0c;你是否了解它们各自对你的跨境在线业务可能产生的深远影响&#xff1f; 在跨境电商领域&#xff0c;选择合适的IP类型对于业务的成功至关重要。动态IP、…...

基于Python flask的豆瓣电影可视化系统,豆瓣电影爬虫系统

博主介绍&#xff1a;✌Java徐师兄、7年大厂程序员经历。全网粉丝13w、csdn博客专家、掘金/华为云等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;&#x1f3fb; 不…...

面试不是一场遭遇战

引言 Ethan第一次跳槽时&#xff0c;把工作总结搞成简历&#xff0c;丢到BOSS&#xff0c;面了几场&#xff0c;结果都很糟。复盘下来&#xff0c;发现面试过程临场发挥太多&#xff0c;把攻坚战打成了遭遇战。 那面试要如何准备&#xff1f;什么情况下跳槽&#xff1f;有哪些大…...

【力扣 | SQL题 | 每日3题】力扣1795,1907,1398,602

1. 力扣1795&#xff1a;每个产品在不同商品的价格 1.1 题目&#xff1a; 表&#xff1a;Products ---------------------- | Column Name | Type | ---------------------- | product_id | int | | store1 | int | | store2 | int | | store3 …...

三维GIS开发cesium智慧地铁教程(5)Cesium相机控制

一、环境搭建 <script src"../cesium1.99/Build/Cesium/Cesium.js"></script> <link rel"stylesheet" href"../cesium1.99/Build/Cesium/Widgets/widgets.css"> 关键配置点&#xff1a; 路径验证&#xff1a;确保相对路径.…...

【机器视觉】单目测距——运动结构恢复

ps&#xff1a;图是随便找的&#xff0c;为了凑个封面 前言 在前面对光流法进行进一步改进&#xff0c;希望将2D光流推广至3D场景流时&#xff0c;发现2D转3D过程中存在尺度歧义问题&#xff0c;需要补全摄像头拍摄图像中缺失的深度信息&#xff0c;否则解空间不收敛&#xf…...

2025 后端自学UNIAPP【项目实战:旅游项目】6、我的收藏页面

代码框架视图 1、先添加一个获取收藏景点的列表请求 【在文件my_api.js文件中添加】 // 引入公共的请求封装 import http from ./my_http.js// 登录接口&#xff08;适配服务端返回 Token&#xff09; export const login async (code, avatar) > {const res await http…...

华为云Flexus+DeepSeek征文|DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建

华为云FlexusDeepSeek征文&#xff5c;DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建 前言 如今大模型其性能出色&#xff0c;华为云 ModelArts Studio_MaaS大模型即服务平台华为云内置了大模型&#xff0c;能助力我们轻松驾驭 DeepSeek-V3/R1&#xff0c;本文中将分享如何…...

HashMap中的put方法执行流程(流程图)

1 put操作整体流程 HashMap 的 put 操作是其最核心的功能之一。在 JDK 1.8 及以后版本中&#xff0c;其主要逻辑封装在 putVal 这个内部方法中。整个过程大致如下&#xff1a; 初始判断与哈希计算&#xff1a; 首先&#xff0c;putVal 方法会检查当前的 table&#xff08;也就…...

Java求职者面试指南:Spring、Spring Boot、MyBatis框架与计算机基础问题解析

Java求职者面试指南&#xff1a;Spring、Spring Boot、MyBatis框架与计算机基础问题解析 一、第一轮提问&#xff08;基础概念问题&#xff09; 1. 请解释Spring框架的核心容器是什么&#xff1f;它在Spring中起到什么作用&#xff1f; Spring框架的核心容器是IoC容器&#…...

【C++特殊工具与技术】优化内存分配(一):C++中的内存分配

目录 一、C 内存的基本概念​ 1.1 内存的物理与逻辑结构​ 1.2 C 程序的内存区域划分​ 二、栈内存分配​ 2.1 栈内存的特点​ 2.2 栈内存分配示例​ 三、堆内存分配​ 3.1 new和delete操作符​ 4.2 内存泄漏与悬空指针问题​ 4.3 new和delete的重载​ 四、智能指针…...

PHP 8.5 即将发布:管道操作符、强力调试

前不久&#xff0c;PHP宣布了即将在 2025 年 11 月 20 日 正式发布的 PHP 8.5&#xff01;作为 PHP 语言的又一次重要迭代&#xff0c;PHP 8.5 承诺带来一系列旨在提升代码可读性、健壮性以及开发者效率的改进。而更令人兴奋的是&#xff0c;借助强大的本地开发环境 ServBay&am…...

AI语音助手的Python实现

引言 语音助手(如小爱同学、Siri)通过语音识别、自然语言处理(NLP)和语音合成技术,为用户提供直观、高效的交互体验。随着人工智能的普及,Python开发者可以利用开源库和AI模型,快速构建自定义语音助手。本文由浅入深,详细介绍如何使用Python开发AI语音助手,涵盖基础功…...

Ubuntu系统复制(U盘-电脑硬盘)

所需环境 电脑自带硬盘&#xff1a;1块 (1T) U盘1&#xff1a;Ubuntu系统引导盘&#xff08;用于“U盘2”复制到“电脑自带硬盘”&#xff09; U盘2&#xff1a;Ubuntu系统盘&#xff08;1T&#xff0c;用于被复制&#xff09; &#xff01;&#xff01;&#xff01;建议“电脑…...