Linux中信号的基础知识

信号的概念

Linux操作系统中,信号是一种进程间通信(Inter-Process Communication, IPC)机制,用于向其他进程发送通知或指示,通常是为了通知特定事件的发生,如程序终止、用户按下特定按键等。信号提供了一种异步的、非阻塞的通信方式,因此在某些情况下非常有用。

使用信号主要的两个目的是:

  • 让进程知道已经发生了一个特定的事情。
  • 强迫进程执行它自己代码中的信号处理程序

信号的特点:

  • 简单
  • 不能携带大量信息
  • 满足某个特定条件才发送
  • 优先级比较高

常用的一些信号

我们可以使用Linux命令:kill -l 去查看所有的信号列表。

以下是一些常见和常用的信号及其简要说明:

  • SIGHUP(1):挂起信号。通常用于通知进程在终端连接关闭时重新读取其配置文件。这个信号可以让一个守护进程(daemon)重新初始化自身,以便在不终止进程的情况下应用新的配置设置。

  • SIGINT(2):中断信号。当用户在终端中按下Ctrl+C时,通常会发送此信号给前台进程。默认情况下,此信号会导致进程终止并生成核心转储文件(core dump)。

  • SIGQUIT(3):退出信号。当用户在终端中按下Ctrl+\时,通常会发送此信号给前台进程。默认情况下,此信号会导致进程终止并生成核心转储文件。

  • SIGILL(4):非法指令信号。当进程尝试执行非法的或未定义的指令时,系统会发送此信号给进程。默认情况下,此信号会导致进程终止并生成核心转储文件。

  • SIGTRAP(5):跟踪陷阱信号。通常由调试器(如gdb)使用,以便在断点处中断进程的执行。默认情况下,此信号会导致进程终止并生成核心转储文件。

  • SIGABRT(6):异常终止信号。通常在进程因内部错误而需要立即终止时发送此信号。默认情况下,此信号会导致进程终止并生成核心转储文件。

  • SIGBUS(7):总线错误信号。当进程执行时发生硬件相关的错误(如内存访问错误)时,系统会发送此信号给进程。默认情况下,此信号会导致进程终止并生成核心转储文件。

  • SIGFPE(8):浮点异常信号。当进程执行时发生与浮点运算相关的错误(如除以零)时,系统会发送此信号给进程。默认情况下,此信号会导致进程终止并生成核心转储文件。

  • SIGKILL(9):强制终止信号此信号用于立即终止进程,进程无法捕获、忽略或阻塞此信号。这是一个强制手段,可能导致数据丢失或系统处于不稳定状态。

  • SIGUSR1(10)和SIGUSR2(12):用户自定义信号。这两个信号保留给用户自定义使用,用于实现自定义的进程间通信。

  • SIGSEGV(11):段错误信号当进程执行时发生与内存访问相关的错误(如访问无效的内存地址)时,系统会发送此信号给进程。默认情况下,此信号会导致进程终止并生成核心转储文件。

  • SIGPIPE(13):管道破裂信号。当进程尝试向一个没有读端的管道中写入数据时,系统会发送此信号给进程。默认情况下,此信号会导致进程终止。

  • SIGALRM(14):闹钟信号。通常由alarm()或setitimer()系统调用设置,用于在指定时间后发送信号给进程。此信号可以用于实现定时器功能。

  • SIGTERM(15):终止信号。这是一个通用的、友好的终止信号,通常用于要求进程正常结束。进程可以捕获此信号并执行清理工作,然后自行结束。

  • SIGCHLD(17):子进程状态改变信号。当子进程终止、停止或恢复运行时,系统会发送此信号给父进程。此信号通常用于实现父进程对子进程的监控。

  • SIGCONT(18):继续信号。用于恢复之前被SIGSTOP或SIGTSTP信号停止的进程。

  • SIGSTOP(19):停止信号。此信号用于暂停进程的执行与SIGKILL类似,进程无法捕获、忽略或阻塞此信号

  • SIGTSTP(20):终端停止信号。当用户在终端中按下Ctrl+Z时,通常会发送此信号给前台进程。此信号可以被进程捕获并执行特定操作,如保存状态或清理资源。

  • SIGTTIN(21)和SIGTTOU(22):终端输入/输出信号。当后台进程尝试从控制终端读取输入或向控制终端写入输出时,系统会发送这些信号给进程。默认情况下,这些信号会导致进程停止。

  • SIGURG(23):紧急信号。当套接字上有紧急数据可读时,系统会发送此信号给进程。此信号通常用于网络编程中,用于处理异常情况。

以上信号仅为Linux系统中常见和常用的信号,实际上还有更多其他信号。不过,了解这些信号已经足够应对大部分场景。对于进程来说,可以根据实际需求捕获和处理这些信号,实现进程间的通信和协同工作。

信号的基本原理

信号的基本原理是,一个进程或内核可以向另一个进程发送信号,而接收信号的进程可以对该信号做出相应的响应。接受信号的进程做出的五种默认响应为:

  • Term: 终止进程
  • Ign: 当前进程忽略掉这个信号
  • Core: 终止进程,并生成一个Core文件
  • Stop: 暂停当前进程
  • Cont: 继续执行当前被暂停的进程

信号的重要特性

以下是Linux信号机制的一些重要特性:

  • 信号的发送:进程可以使用系统调用kill()、raise()等函数向其他进程发送信号。同时,用户也可以通过终端使用kill命令来发送信号。

  • 信号的接收:当进程接收到信号时,它可以选择忽略信号、执行默认操作或者捕获信号并执行自定义的信号处理函数。

  • 信号的处理:进程可以使用系统调用sigaction()或signal()为特定信号设置自定义的信号处理函数。信号处理函数通常用于在接收到信号时执行某些任务,如清理资源或修改程序的执行状态。

  • 信号的阻塞与解除阻塞:进程可以使用sigprocmask()等函数来阻塞或解除阻塞特定信号。阻塞的信号不会立即被处理,而是在信号解除阻塞后才会被传递给进程。

  • 信号的排队与合并:Linux信号支持排队,但是对于同一信号类型,只会保留一个实例。这意味着,在信号尚未处理时,如果再次发送相同类型的信号,该信号不会被排队,而是被合并到一个实例中。

  • 实时信号:Linux还支持实时信号(RT signals),它们可以排队并携带额外的数据。实时信号的优先级较高,因此在多个信号同时传递给进程时,实时信号会优先处理。

信号相关的函数

  • Linux系统调用之kill函数(进程相关函数)
  • 标准C库之raise,abort函数(进程通信函数,发送信号类函数)
  • Linux系统调用之alarm,setitimer函数(定时器,向当前进程发送一个信号、循环/间隔定时器,周期性的向当前进程发送信号)

信号捕捉函数

  • Linux系统调用之signal,sigaction函数 (捕捉指定的信号,自定义/默认处理该信号)

信号集的概念

  • 许多信号相关的系统调用都需要能表示一组不同的信号,多个信号可使用一个称之为信号集的数据结构来表示,其系统数据类型为 sigset_t。
  • 在 PCB 中有两个非常重要的信号集。一个称之为 “阻塞信号集” ,另一个称之为“未决信号集” 。这两个信号集都是内核使用位图机制来实现的。但操作系统不允许我们直接对这两个信号集进行位操作。而需自定义另外一个集合,借助信号集操作函数来对 PCB 中的这两个信号集进行修改。
  • 信号的 “未决” 是一种状态,指的是从信号的产生到信号被处理前的这一段时间。
  • 信号的 “阻塞” 是一个开关动作,指的是阻止信号被处理,但不是阻止信号产生。
  • 信号的阻塞就是让系统暂时保留信号留待以后发送。由于另外有办法让系统忽略信号,所以一般情况下信号的阻塞只是暂时的,只是为了防止信号打断敏感的操作。

阻塞信号集和未决信号集

在这里插入图片描述

与信号集相关的函数

  • 标准C库sigemptyset、sigfillset函数(清空自定义信号集,阻塞信号
    集所有信号)
  • 标准C库之sigismember、sigaddset、sigdelset函数(检查某个信号是否被阻塞,阻塞自定义信号集中的某一个信号,不阻塞自定义信号集中的某一个信号)
  • Linux系统调用之sigprocmask、sigpending函数(设置内核阻塞信号集,查看内核未决信号集)

内核实现信号捕捉的过程

在这里插入图片描述

SIGCHLD信号

  • SIGCHLD信号产生的条件
    • 子进程终止时
    • 子进程接收到 SIGSTOP 信号停止时
    • 子进程处在停止态,接受到SIGCONT后唤醒时

以上三种条件都会给父进程发送 SIGCHLD 信号,父进程默认会忽略该信号

总结

总之,信号是Linux中一种重要的进程间通信机制,它提供了一种简单、灵活的方式来处理进程间的通知和事件。然而,信号机制的异步性和非阻塞性也导致了一些困难和问题,例如竞态条件和信号处理的复杂性。因此,在某些场景下,其他进程间通信机制,如管道、消息队列和共享内存等,可能会更加适合。

最后的最后,如果你觉得我的这篇文章写的不错的话,请给我一个赞与收藏,关注我,我会继续给大家带来更多更优质的干货内容

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

在字节跳动做了6年软件测试,4月无情被辞,想给划水的兄弟提个醒

先简单交代一下背景吧,某不知名 985 的本硕,17 年毕业加入字节,以“人员优化”的名义无情被裁员,之后跳槽到了有赞,一直从事软件测试的工作。之前没有实习经历,算是6年的工作经验吧。 这6年之间完成了一次…

浅谈springboot启动过程

1. 知识回顾 为了后文方便,我们先来回顾一下spring的一些核心概念。 spring最核心的功能无非是ioc容器,这个容器里管理着各种bean。ioc容器反映在java类上就是spring的核心类ApplicationContext。ApplicationContext有众多的子接口和子类,不…

文旅数字人出圈不断,文旅数字人宣传片制作赋能数字文旅新业态

在文旅产业发展中 数字人的应用越来越广泛 文旅借助数字人浪潮 把传统文化与科技相融合 以Z世代年轻群体所喜爱的方式 推动文旅数字化发展 文旅数字人应用场景——数字人文旅宣传片 可以让数字人作为文旅宣传片主角,串联当地代表性的历史文化地标、现代都市场景…

sensor的感光原理

文章内容来自网络,联系我可以删掉。 目录 CMOS sensor上有什么? 不同像素对应的图像质量: 像点感光原理: Bayer格式变换成RGB格式: CMOS sensor上有什么? CMOS sensor 通常由像敏单元阵列、行驱动器、…

第10章:数据处理增删改

一、插入数据 CREATE TABLE emp1 (id int(11) ,name varchar(15) ,hire_date date ,salary double(10,2) )1.添加一条数据 ①没有指明添加的字段,一定按照顺序添加 insert into emp1 values(1,wang,2000-4-4,5900)②指明添加的字段(推荐)…

【CSS3】CSS3 属性选择器 ( CSS3 简介 | 属性选择器 | 属性选择器权重 )

文章目录 一、CSS3 简介二、CSS3 属性选择器权重三、CSS3 属性选择器 一、CSS3 简介 CSS3 是在 CSS2 基础上进行扩展后的样式 ; 在 移动端 对 CSS3 的支持 要比 PC 端支持的更好 , 建议在移动端开发时 , 多使用 CSS3 ; PC 端老版本浏览器不支持 CSS3 , 尤其是 IE 9 及以下的版…

Qt5.9学习笔记-事件(五) 事件调试和排查

⭐️我叫忆_恒心,一名喜欢书写博客的在读研究生👨‍🎓。 如果觉得本文能帮到您,麻烦点个赞👍呗! 近期会不断在专栏里进行更新讲解博客~~~ 有什么问题的小伙伴 欢迎留言提问欧,喜欢的小伙伴给个三…

【超详细】【YOLOV8使用说明】一套框架解决CV的5大任务:目标检测、分割、姿势估计、跟踪和分类任务【含源码】

目录 1.简介2.环境安装2.1安装torch相关库2.2 获取yolov8最新版本,并安装依赖 3. 如何使用模型用于各种CV任务3.1 目标检测任务实现检测图片代码检测视频代码 3.2 分割任务实现分割图片代码分割视频代码 3.3 追踪任务3.4 姿态检测任务姿态检测(图片&…

数据结构之“树”——二叉树、红黑树、B树、B+树、B*树

这篇文章主要简单总结下二叉树、红黑树、B树、B树、B*树的基本结构和原理。 一、二叉树 二叉树就是度不超过2的树(每个结点最多有两个子结点)。 二叉树是有序树(二叉排序树),若将其左右子树颠倒,则成为另一棵不同的二叉树。 二叉…

php+vue+mysql医院医护人员医生排班系统

本医护人员排班系统管理员,医护。管理员功能有个人中心,医院信息管理,医护信息管理,医护类型管理,排班信息管理,排班类型管理,科室信息管理,投诉信息管理。医护人员可以修改自己的个…

「二线豪华」或成历史,理想反超沃尔沃再树「里程碑」

今年的上海车展,除了占据C位的新能源汽车,还有传统车企。 上海车展开幕前,沃尔沃汽车大中华区销售公司总裁钦培吉在新车发布会上直言:“新势力会的,我们三年就学会了;我们会的,新势力十年都学不…

Android安装apk出现 “安装包无效”或“安装包不兼容”的解决方案

Android 安装apk出现“安装包无效”或“安装包不兼容”解决方案 1. 问题出现2. 配置 build.gradle3. 生成Signed APK 1. 问题出现 使用Android Studio安装apk到手机一切正常,但是分享出去出现安装apk出现“安装包无效”或“安装包不兼容”问题 这种情况需要我们设…

4 IK分词器

4 IK分词器 4.1测试分词器 在添加文档时会进行分词,索引中存放的就是一个一个的词(term),当你去搜索时就是拿关键字去匹配词,最终 找到词关联的文档。 测试当前索引库使用的分词器: post 发送&#xff…

【分布式理论】聊一下 ACID、BASE、CAP、FLP

分布式理论基础 今天我们来聊一下分布式相关基础理论基础,上一篇文章中,我描述了一下分布式系统的纲,但是想要入手学习分布式系统设计,其实需要先从基本理论开始。而知名的ACID、BASE、CAP、FLP都是相关的理论基础。 ACID ACID…

六、FM1288调试方案-调试过程及细节

本篇文章,主要讲述实际调试操作:具体到需要调节哪些寄存器,调节完后,会有什么样的变化。但是整体效果不能达到我们期望的绝对感觉,所以我先把我们调试的结果放在前面,如果觉得不理想,也可以不看后面的内容了。 文章目录 1. 调试准备1.1 建立与FM1288芯片通信1.2 Uart结…

什么是多相流?在熟悉工业中常见的两相及多相流的分类及特点

文章目录 一、多相流的概览1.相的概念 二、多相流的引入单相流与多相流: 三、多相流及特性介绍四、常见的多相流的分类及特点1、常见的两相及多相流3、两相流动力学的发展简史4、两相流的研究方法和理论模型 一、多相流的概览 1.相的概念 物理学: 自然界中物质的态…

基于simulink使用麦克风阵列的声波束成形

一、前言 此示例演示如何对麦克风阵列接收到的信号进行波束化,以在嘈杂环境中提取所需的语音信号。 二、模型的结构 该模型模拟在 10 元件均匀线性麦克风阵列 (ULA) 上接收来自不同方向的三个音频信号。在接收器处添加热噪声后,应…

智慧厕所引导系统的应用

智慧公厕引导系统是一种基于智能化技术的公厕管理系统,可以为如厕者提供更加便捷、舒适、安全的如厕环境和服务,同时也可以引导如厕者文明如厕,营造文明公厕的氛围。智慧公厕引导系统可以通过智能引导屏、手机小程序等方式,为如厕…

【存储数据恢复】NetApp存储WAFL文件系统数据恢复案例

存储数据恢复环境: NetApp存储设备,WAFL文件系统,底层是由多块硬盘组建的raid磁盘阵列。 存储故障: 工作人员误操作导致NetApp存储内部分重要数据被删除。 存储数据恢复过程: 1、将存储设备的所有磁盘编号后取出&…

Linux上Nacos基本使用:连接MySQL并修改密码、启动、停止命令等

Nacos如何连接MySQL并修改密码 说明如何将内嵌数据库Derby切换为MySQL数据库直接新建MySQL数据库: 必须是MySQL5.7及以上 如何修改密码启动、停止命令 说明 nacos默认: 使用内嵌的数据库(Derby)默认登录地址 ip:8848/nacos; 账号&#xff1…