Linux中的阻塞信号与信号原理

在Linux操作系统中,信号(Signal)是进程间通信和进程控制的核心机制之一。信号是一种异步通知机制,可以向进程发送异步事件通知,以便进程能够处理系统级别的事件。本文将详细探讨Linux中的信号原理,重点讲解阻塞信号的机制及其使用。

一、Linux信号的基本概念

1. 什么是信号

信号是一种轻量级的异步通知机制,通常用于通知进程发生了某种事件。信号可以由内核、用户或进程本身产生。例如,当用户按下 Ctrl+C 时,系统会向前台进程发送 SIGINT 信号,通知进程终止。

2. 常见信号

一些常见的Linux信号包括:

  • SIGHUP:挂起信号,通常在终端断开连接时发送。
  • SIGINT:中断信号,通常由 Ctrl+C 触发,要求进程终止。
  • SIGKILL:强制终止信号,不能被捕获或忽略,立即终止进程。
  • SIGTERM:终止信号,程序可以捕获并执行清理工作后退出。
  • SIGSEGV:无效内存访问信号,通常在程序访问未分配的内存时触发。

二、信号处理机制

信号可以被进程捕获、忽略或使用默认处理方式。对于每种信号,进程都可以设置一个信号处理函数,当信号发生时,操作系统会调用该函数。

1. 注册信号处理函数

使用 signal() 函数可以注册一个信号处理函数:

#include <signal.h>
#include <stdio.h>
#include <unistd.h>void handle_sigint(int sig) {printf("Caught signal %d\n", sig);
}int main() {signal(SIGINT, handle_sigint);while (1) {printf("Running...\n");sleep(1);}return 0;
}

解释:在上面的代码中,当进程收到 SIGINT 信号时(如按下 Ctrl+C),handle_sigint() 函数会被调用,从而在终端打印信号编号。

2. 信号的默认处理

如果进程没有为信号指定处理函数,操作系统会执行默认处理。例如,SIGKILL 信号的默认行为是立即终止进程,SIGSEGV 信号的默认行为是终止进程并生成内核转储(core dump)。

三、阻塞信号

阻塞信号是一种控制信号传递的机制。通过阻塞信号,进程可以暂时阻止某些信号的处理,直到解除阻塞为止。这对于保护关键代码段非常有用,确保在执行关键操作时不会被信号中断。

1. 使用 sigprocmask 阻塞信号

sigprocmask 函数用于检查和更改进程的信号掩码(signal mask),从而控制信号的阻塞。

#include <signal.h>
#include <stdio.h>
#include <unistd.h>int main() {sigset_t set;sigemptyset(&set);sigaddset(&set, SIGINT);// 阻塞SIGINT信号sigprocmask(SIG_BLOCK, &set, NULL);printf("SIGINT is blocked\n");sleep(10);// 解除阻塞sigprocmask(SIG_UNBLOCK, &set, NULL);printf("SIGINT is unblocked\n");while (1) {sleep(1);}return 0;
}

解释:在上面的代码中,我们首先创建一个空的信号集 set,然后将 SIGINT 添加到这个信号集中。通过 sigprocmask 函数,我们阻塞了 SIGINT 信号。此时,即使用户按下 Ctrl+C,进程也不会立即响应。10秒后,我们解除阻塞,进程恢复对 SIGINT 的处理。

2. 使用 sigsuspend 进行信号等待

sigsuspend 函数用于暂时替换进程的信号掩码,并挂起进程直到接收到信号。常用于实现安全的信号等待操作。

#include <signal.h>
#include <stdio.h>
#include <unistd.h>void handle_sigint(int sig) {printf("Caught signal %d\n", sig);
}int main() {signal(SIGINT, handle_sigint);sigset_t set, oldset;sigemptyset(&set);sigaddset(&set, SIGINT);// 阻塞SIGINT信号sigprocmask(SIG_BLOCK, &set, &oldset);printf("Waiting for SIGINT\n");// 暂时解除阻塞,并挂起进程等待信号sigsuspend(&oldset);printf("Resuming execution\n");return 0;
}

解释:sigsuspend 函数接收一个信号集作为参数,并暂时将其作为新的信号掩码,然后挂起进程直到接收到信号。信号处理函数处理完信号后,进程恢复执行。

四、信号阻塞与处理的应用场景

阻塞信号的常见应用场景包括:

  • 关键代码保护:在执行关键操作时,阻塞信号可以防止因信号中断而导致的不一致状态。
  • 同步多线程:在多线程编程中,主线程可以阻塞特定信号,而让其他线程处理该信号,从而实现线程间的同步。
  • 复杂信号处理:在需要处理多个信号或需要确保特定顺序的信号处理时,可以使用阻塞和解除阻塞的机制来实现。

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

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

相关文章

QT学习教程(三十五)

事件处理&#xff08;- Event Processingn&#xff09; 事件是视窗系统或者Qt 本身在各种不同的情况下产生的。当用户点击或者释放鼠标&#xff0c;键盘时&#xff0c;一个鼠标事件或者键盘事件就产生了。当窗口第一次显示时&#xff0c;一个绘制事件会产生告诉新可见的窗口绘…

【Dify 案例】【MCP实战】【三】【超级美食家】

接上次的超级助理,我们这一期给出一个超级美食家 首先:我的MCP要申请一个key ` 我们来看看这个MCP服务怎么使用呢。`https://modelscope.cn/mcp/servers/@worryzyy/howtocook-mcp插件里面需要配置 {"mcpServers":{"amap-amap-sse":{"url":&qu…

4.文件管理(文本、日志、Excel表)

目录 1.文本 2.日志 3.Excel表 1.文本 using System.Text;namespace (自己创建的一个类) {/// <summary>/// 配置文件*.ini读写器。/// </summary>public class IniFile{[System.Runtime.InteropServices.DllImport("kernel32")]private static ex…

Java 包装类详解

什么是包装类 Java包装类&#xff08;Wrapper Classes&#xff09;是将8种基本数据类型封装成对象的类&#xff0c;位于java.lang包中。每个基本数据类型都有对应的包装类&#xff1a; byte → Byteshort → Shortint → Integerlong → Longfloat → Floatdouble → Doublec…

阿里云ACP认证-数据仓库

数据仓库 Kappa架构&#xff1a;将实时和离线代码统一&#xff08;优化lambda架构&#xff09;&#xff0c;但是不好修正数据&#xff0c;开发周期长&#xff0c;成本浪费&#xff0c;对于历史数据的高吞吐量力不从心 原一代数据仓库&#xff1a; 离线&#xff1a;hivemaxcom…

WebRTC(五):TURN协议

TURN&#xff08;Traversal Using Relays around NAT&#xff09;协议是一个网络协议&#xff0c;旨在解决 NAT&#xff08;网络地址转换&#xff09;和防火墙 环境下的 UDP/TCP通信问题。它通常与 STUN 和 ICE 协议一起使用&#xff0c;广泛应用于 WebRTC、SIP 和视频会议等实…

Python 的内置函数 hasattr

Python 内建函数列表 > Python 的内置函数 hasattr Python 的内置函数 hasattr() 用于检查一个对象是否具有指定的属性或方法。该函数的语法为&#xff1a; hasattr(object, name)参数说明&#xff1a; object&#xff1a;要检查的对象&#xff0c;可以是任何 Python 对象…

docker使用技巧之把扩展卷命名变成有意义

背景 之前使用别人的镜像之后&#xff0c;启动docker后发出现了一堆看不懂名称的扩展卷 eg&#xff1a;集群查看 扩展卷查看 这个时候如果有很多集群需要清理扩展卷就很麻烦&#xff0c;不知道是哪个集群的 操作步骤 可以实现的分析&#xff1a;这个扩展卷的信息应该是和…

《博物通书》《博物新编》与满清历史篡改

《博物新编》作为近代西方科技输入中国的首部著作&#xff0c;其问世犹如一颗投入平静湖面的巨石&#xff0c;在 19 世纪中期的中国激起层层涟漪&#xff0c;对中国近代科学发展产生了多维度、深层次的影响。它不仅是知识传播的载体&#xff0c;更是推动中国科学从传统走向近代…

【入门】【例18.1】 睡眠

| 时间限制&#xff1a;C/C 1000MS&#xff0c;其他语言 2000MS 内存限制&#xff1a;C/C 64MB&#xff0c;其他语言 128MB 难度&#xff1a;中等 分数&#xff1a;100 OI排行榜得分&#xff1a;12(0.1分数2难度) 出题人&#xff1a;root | 描述 一个人只有每天睡眠时间到达 8…

DAY 38 Dataset和Dataloader类

知识点回顾&#xff1a; Dataset类的__getitem__和__len__方法&#xff08;本质是python的特殊方法&#xff09;Dataloader类minist手写数据集的了解 作业&#xff1a;了解下cifar数据集&#xff0c;尝试获取其中一张图片 import torch import torch.nn as nn import torch.o…

【Kubernetes】以LOL的视角打开K8s

前言 对于大部分后端程序员乃至于非后端程序员来说&#xff0c;在当前的云原生时代&#xff0c;Kubernetes&#xff08;后称K8s&#xff09;都是绕不开的一项技术&#xff1b;同时&#xff0c;对于这个时代的程序员来说&#xff0c;“英雄联盟”&#xff08;后称LOL&#xff0…

UE5 游戏模板 —— FirstShootGame

UE5 游戏模板 —— FirstShootGame 前言一、GameMode二、组件1.ShooterPickUpComponent单播多播 2.ShooterWeaponComponent附着武器开火 3.小结4.ShooterProjectile初始化碰撞受击检测 三、Character初始化输入移动 总结 前言 有了前两个俯视角游戏的基础让我们来看看相对复杂…

国家级与省级(不含港澳台)标准地图服务网站汇总

在先前的文章中&#xff0c;介绍了部分省级的标准地图服务网站可以下载各个区县近几年、不同要素的标准地图&#xff08;链接&#xff1a;国家与省市县 标准地图服务网站 审图号地图下载&#xff09;&#xff0c;但是当时只汇总了部分省级的标准地图服务网站。 这两天看到了一个…

前端开发面试题总结-vue3框架篇(一)

文章目录 Vue3高频问答一、vue2/vue3中常用的构建工具和脚手架分别是什么? 有什么区别?二、请说一说vue2和vue3的区别&#xff1f;三、请说一说vue2和vue3响应式原理的区别&#xff1f;四、vue3 如何定义响应式数据?五、说一说你对vue3中的setup函数?六、说一说vue3中的路由…

【LLM06---相对位置编码】

文章目录 相对位置编码经典式XLNET式T5式DeBERTa式 相对位置编码 上一节我们介绍了绝对位置编码&#xff0c;这一节我们来看相对位置编码&#xff0c;也就是用相对位置信息来表示&#xff0c;之前每一个token的位置式通过一个绝对的位置向量来表示的&#xff0c;现在我们在计算…

纯跟踪算法本质解密:航向角偏差=预瞄角?数学证明与工程实践

定义关键问题 在深入纯跟踪算法核心前&#xff0c;必须澄清一对容易被混淆但至关重要的概念&#xff1a; 概念坐标系物理意义计算方式航向角偏差(α_global)全局坐标系车辆航向与预瞄点方向的夹角预瞄点方位角 - 车辆航向角预瞄角(α_body)车身坐标系预瞄点相对于车辆纵轴的夹…

自动驾驶叉车在仓库环境中是否安全?

随着自动驾驶叉车的兴起&#xff0c;仓库运营持续演进。叉车自动化技术的引入使仓库设施变得更快、更安全且更具成本效益。然而一个关键问题依然存在&#xff1a;它们在繁忙的仓库环境中是否安全&#xff1f; 一 、什么是自动驾驶叉车&#xff1f; 自动驾驶叉车&#xff0c;也…

Neo4j操作指南:修改节点数据与新增节点属性

Neo4j操作指南&#xff1a;修改节点数据与新增节点属性 引言 Neo4j作为领先的图数据库&#xff0c;提供了灵活的数据操作方式。在实际应用中&#xff0c;我们经常需要修改已有节点的数据或为节点添加新属性。本文将详细介绍如何使用Cypher查询语言在Neo4j中完成这些操作&…

AI大模型学习之基础数学:微积分在AI大模型中的核心-梯度与优化(梯度下降)详解

微积分在AI大模型中的核心:梯度与优化(梯度下降) 人工智能(AI)大模型的训练和优化依赖于数学基础,其中微积分、线性代数和概率统计构成了其理论核心。微积分在AI中的核心作用在于提供优化工具,尤其是通过梯度和梯度下降方法,帮助模型在高维参数空间中找到损失函数的最…