Linux系统编程之信号基础知识

news/2025/2/12 0:29:31/

概述

        信号Linux系统中用于进程间通信的一种机制,允许一个进程通知另一个进程发生了某些特定事件。信号可以来自硬件中断、用户输入,也可以来自其他进程或者内核本身。信号是一种异步通知机制,当某个事件发生时,操作系统会向目标进程发送一个信号信号本质上是一个整数值,每个值代表一种不同的事件类型。

信号的类型

        Linux定义了许多不同类型的信号,一些常用的信号、取值及其含义可参见下表。

信号

取值

含义

SIGHUP

1

终端挂起或控制终端关闭时发出,常用于重启守护进程

SIGINT

2

用户按下Ctrl+C时产生,通常用来请求终止程序。

SIGKILL

9

强制终止进程,无法被捕获或忽略。

SIGUSR1

10

用户自定义信号1,可以根据需要自由使用

SIGSEGV

11

非法内存访问(即段错误),通常是由于程序试图访问未分配或保护的内存区域引起的。

SIGUSR2

12

用户自定义信号2,可以根据需要自由使用

SIGALRM

14

定时器到期时发出,常用于实现超时功能。

SIGTERM

15

请求正常终止进程,默认行为为优雅退出。

SIGCHLD

17/18/20

子进程状态改变(比如:暂停、终止等)时发出,父进程可以通过这个信号得知子进程的状态变化。

信号的生命周期

        一个信号从产生到被清除,主要会经历以下六个阶段。

        1、信号的生成。当某个事件发生时,操作系统会生成相应的信号信号可以由以下几种方式触发。

        (1)硬件中断。比如:非法指令执行、除零错误等。

        (2)软件事件。比如:用户按下Ctrl+C、调用kill函数发送信号给另一个进程等。

        (3)定时器到期。比如:alarm或setitimer函数设置的定时器到期时,产生的SIGALRM信号

        (4)子进程状态变化。比如:子进程终止或暂停时,发出的SIGCHLD信号

        (5)内核检测到异常情况。比如:非法内存访问时,产生SIGSEGV信号

        2、信号的传递。一旦信号被生成,它会被加入到目标进程的未决信号集中。此时,信号处于“未决”状态,意味着它已经被创建,但还没有被传递给进程。传递方式分为以下两种。

        (1)立即传递。如果进程当前没有阻塞该信号,则信号会被立即传递给进程。

        (2)等待传递。如果进程已经设置了对该信号的阻塞,则信号会在未决信号集中等待,直到进程解除对该信号的阻塞。

        3、信号的排队。对于大多数信号类型来说,Linux只保持一个实例,即使同一类型的多个信号连续到达,也只会记录最新的那个。然而,有一些特殊的信号(比如:SIGCHLD)是可以排队的,即可以同时存在多个实例。排队方式分为以下两种。

        (1)非排队。比如:SIGINT,如果两个SIGINT信号几乎同时到达,只有最后一个会被记录下来。

        (2)排队。比如:SIGCHLD,每个子进程状态的变化都会产生一个新的SIGCHLD信号,并且它们会被独立地排队。

        4、信号的阻塞与解除阻塞。进程可以通过调用sigprocmask函数来改变其信号掩码,从而实现对特定信号的阻塞或解除阻塞。通过将信号添加到进程的信号掩码中,可以暂时阻止该信号的传递。通过从信号掩码中移除信号,可以让之前被阻止的信号重新变得可传递。

        5、信号的处理。当信号成功传递给进程后,它将根据预先设定的行为进行处理。处理方式取决于信号的默认动作,或者用户自定义的信号处理函数。

        (1)默认行为。每种信号都有一个默认的动作,比如:终止进程、忽略信号、生成核心转储文件等。如果程序没有为某种信号注册处理函数,那么它将按照默认行为执行。

        (2)自定义处理函数。我们可以通过signal或sigaction函数为特定信号注册自定义处理函数,这样当信号到达时,程序会切换到信号上下文并调用对应的处理函数。

        6、信号的清除。一旦信号被处理完毕,就被认为是已处理的状态,并从进程的未决信号集中移除。这意味着,同一个信号不会再次触发相同的处理逻辑,除非又有新的相同类型的信号生成。


http://www.ppmy.cn/news/1571279.html

相关文章

【小鱼闪闪】自制物联网测温小程序远程监测温度(图文)

小飞鱼之前写过一个将测温元件读取数据后写入到本地服务器的程序,可是这样有一个缺点就是只能局限于局域网来查询数据,而对于在办公楼外就不能查看数据。为了解决这个问题,今天小飞鱼做了一个可以将温度数据写入到云端的程序,再通…

【漫话机器学习系列】086.机器学习中的能力(Capacity)

机器学习中的能力(Capacity) 1. 引言 在机器学习中,模型的能力(Capacity)是一个重要的概念,它决定了模型能够学习的函数复杂度。简单来说,能力衡量了一个模型拟合不同函数的能力。能力越强的模…

和鲸科技上线 DeepSeek 系列模型服务,助力数智企业 AI 业务创新!

近日,和鲸科技团队宣布旗下数据科学协同平台 ModelWhale 实现对 DeepSeek 全系列大模型的深度支持,旨在帮助更多数智化转型企业提供从算力基建到业务融合的全栈式解决方案,快速搭建自主可控的云端智能服务体系,实现大模型与业务系…

数据库创库建表处理

新建数据库 mysql> create database mydb15_indexstu; Query OK, 1 row affected (0.03 sec)mysql> use mydb15_indexstu; Database changed 新建表 创建学生信息表 mysql> create table Student( Sno int primary key auto_increment, Sname varchar(30) not nul…

游戏引擎学习第95天

回顾昨天的内容 我们一起完成游戏开发。我们正在进行自定义渲染的工作,这非常棒。我们基本上是在实现一个GPU的功能,自己来做这一切,这样我们可以看到它是如何运作的。 令人惊讶的是,整个过程并没有花费太多时间。当最初想到要实…

【大模型】DeepSeek与chatGPT的区别以及自身的优势

目录 一、前言二、核心技术对比2.1 模型架构设计2.1.1 ChatGPT的Transformer架构2.1.2 DeepSeek的混合架构 2.2 训练数据体系2.2.1 ChatGPT的数据特征2.2.2 DeepSeek的数据策略 三、应用场景对比3.1 通用场景表现3.1.1 ChatGPT的强项领域3.2.2 DeepSeek的专项突破 3.3 响应效率…

实操给触摸一体机接入大模型语音交互

本文以CSK6 大模型开发板串口触摸屏为例,实操讲解触摸一体机怎样快速增加大模型语音交互功能,使用户能够通过语音在一体机上查询信息、获取智能回答及实现更多互动功能等。 在本文方案中通过CSK6大模型语音开发板采集用户语音,将语音数据传输…

Java 2024年面试总结(持续更新)

目录 最近趁着金三银四面了五六家公司吧,也整理了一些问题供大家参考一下(适合经验三年左右的)。 面试问题(答案是我自己总结的,不一定正确): 总结: 最近趁着金三银四面了五六家公…