Linux中信号的基础知识

news2025/2/27 11:20:41

信号的概念

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

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

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

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

相关文章

java获取输入内容的方法

Java中的对象类型可以有多种,比如 Object、 StringBuilder等,其中 Object和 String是最常用的对象类型,而 StringBuilder类是一种特殊的类,它能通过继承来创建其他的对象。 我们在平时的工作中经常会遇到需要获取输入内容的情况&a…

界面控件DevExpress Blazor UI v22.2亮点:全新的Window组件

DevExpress拥有.NET开发需要的所有平台控件,包含600多个UI控件、报表平台、DevExpress Dashboard eXpressApp 框架、适用于 Visual Studio的CodeRush等一系列辅助工具,该组件拥有众多新产品和数十个具有高影响力的功能,可为桌面、Web和移动应…

详解async 与 await,带您理解Playwright使用异步方法的正确姿势!

大家在使用python做playwright自动化测试的过程中,一定会发现下面这种异步用法 async def func():await apiawait api 很多同学可能只是按照这种写法来编写项目的自动化测试代码,对于具体细节可能并不了解,今天我就来讲一下playwright异步用…

基于fNIRS的脑功能连接分析:图论方法

导读 背景:fNIRS是一种利用近红外光谱进行功能神经成像的光学脑监测技术。它使用近红外光来测量大脑活动,并估计由于运动活动而引起的大脑皮层血流动力学活动。fNIRS通过光学吸收来测量含氧和脱氧血红蛋白中氧水平的变化。多源噪声和伪影干扰导致的信号…

【P6】JMeter HTTP Cookie管理器

文章目录 一、测试网站二、Cookie 设置规则2.1、无配置元件时,Cookie 不会自动设置(与线程组设置无关)2.2、有配置元件,不选任何参数时,Cookie 自动设置(与线程组设置无关)2.3、有配置元件&…

Java——二叉搜索树中第k小的元素

题目链接 leetcode在线oj题——二叉搜索树中第k小的元素 题目描述 给定一个二叉搜索树的根节点 root ,和一个整数 k ,请你设计一个算法查找其中第 k 个最小元素(从 1 开始计数)。 题目示例 示例1 输入:root [3,1…

软件工程本科生毕业论文中常见问题总结

文章目录 目录结构不合理 绪论(引言)研究内容 表格表格首行不要加粗表格能不跨页的就不要跨页 其他常见格式问题专有名词要用统一写法 首先先仔细阅读: 本科生毕业论文(设计)写作与排版打印规范 目录 结构不合理 2.…

Ubuntu 增加swap交换内存

一、创建虚拟内存 在实际开发中发现swap交换分区不够用了,于是需要创建虚拟内存来增加交换分区的大小。 在系统空闲空间位置创建swap虚拟内存专用文件夹 cd /data //切到你想要创建交换分区的目录 mkdir swap //新建文件夹swap cd swap //进入swap文件夹 备…

Fastjson<1.2.48远程代码执行漏洞(CNVD-2019-22238)

漏洞存在原因 在fastjson<1.2.24版本中&#xff0c;在解析json的过程中&#xff0c;支持使用autoType来实例化某一个具体的类&#xff0c;并调用该类的set/get方法来访问属性。而在1.24<fastjson<1.2.48版本中后增加了反序列化白名单&#xff0c;而在1.2.48以前的版本…

【容器化应用程序设计和开发】2.4 容器网络和存储

往期回顾&#xff1a; 第一章&#xff1a;【云原生概念和技术】 第二章&#xff1a;2.1 容器化基础知识和Docker容器 第二章&#xff1a;2.2 Dockerfile 的编写和最佳实践 第二章&#xff1a;2.3 容器编排和Kubernetes调度 2.4 容器网络和存储 容器网络和存储是容器化应用…

操作系统第二章——进程与线程(下)

东风夜放花千树&#xff0c;更吹落&#xff0c;星如雨 文章目录 2.3.1 进程同步&#xff0c;进程互斥知识总览什么是进程同步什么是进程互斥知识回顾 2.3.2 进程互斥的软件实现方法知识总览如果没有进程互斥单标志法双标志先检查法双标志后检查法Peterson算法知识回顾 2.3.3进程…

Linkage Mapper解密数字世界链接 专栏内容介绍

✅创作者&#xff1a;陈书予 &#x1f389;个人主页&#xff1a;陈书予的个人主页 &#x1f341;陈书予的个人社区&#xff0c;欢迎你的加入: 陈书予的社区 &#x1f31f;专栏地址: Linkage Mapper解密数字世界链接 在数字时代&#xff0c;链接是信息的核心&#xff0c;链接地…

typescript:熟练掌握typescript

一、简介 TypeScript 教程 | 菜鸟教程 TypeScript (简称:TS)是JavaScript的超集 (JS有的TS 都有)。 TypeScriptType JavaScript (在JS 基础之上&#xff0c;为JS添加了类型支持)。 哔哩哔哩_教程_TypeScript 二、TypeScript为什么要为js增加类型支持&#xff1f; 背景&am…

Flowable+React+bpmn-js实现工作流

由于新东家使用的是React&#xff0c;不是Vue&#xff0c;而自己一直想做一个关于工作流的应用出来&#xff0c;断断续续&#xff0c;花了几个月的时间&#xff0c;开发了工作流的功能&#xff0c;后面会继续完善。 技术栈 前端 前端是基于React开发的&#xff0c;使用了ant…

【LeetCode】704.二分查找

704.二分查找 解析&#xff1a; 思路一&#xff1a;暴力解法&#xff0c;直接遍历&#xff0c;从头开始查找&#xff0c;如果找到直接返回下标&#xff0c;找不到返回-1。 class Solution { public:int search(vector<int>& nums, int target) {for(int i 0; i <…

[架构之路-192]-《软考-系统分析师》-8-软件工程 - 14种UML图快速概览

目录 第1章 UML概述 1.1 什么是UML&#xff1f; 1.2 为什么要用UML&#xff1f; 1.3 UML图有哪些&#xff1f; 1.4 UML图概览 第2章 UML图示 2.1 静态图、结构图 - 什么是类图&#xff1f; 泛化&#xff08;Generalization&#xff09; 实现&#xff08;Realization&a…

四:redis的常见命令及5种基本数据类型

四:redis的常见命令及数据类型 Redis 键(key) 命令1.String&#xff08;字符串&#xff09;2.List(列表类型)3.set(集合)4.Hash(哈希)5.Zset(有序集合) redis官网可查看所有命令&#xff1a; https://www.redis.net.cn/order/ Redis 键(key) 命令 127.0.0.1:6379> keys * …

String、StringBufer、StringBuild类

文章目录 1. String1.1 String的特性1.2 String的不可变的特性理解1.3 String不同实例化方式的对比1.4 *String中的常用方法1.5 String与其他类型之间的转换1.5.1 String与基本数据类型、包装类之间的转换1.5.2 String与字符数组(char[])之间的转换 2. StringBuffer类2.1 Strin…

如何从菜鸟变成大佬:提升写文案的技巧

其实很多人都不知道文案是什么&#xff1f; 他们分不清文案和日常的写作之间的区别。 其实&#xff0c;文案和日常的写作的最大区别就是是否能够产生销售力。 比如你平时写作文、写博客、写情感文章、写政府报告&#xff0c;公文、写书之类的&#xff0c;都不属于文案的范畴…

基于线上考研资讯数据抓取的推荐系统的设计与实现(论文+源码)_kaic

摘 要 随着互联网的飞速发展&#xff0c;互联网在各行各业的应用迅速成为众多学校关注的焦点。他们利用互联网提供电子商务服务&#xff0c;然后有了“考研信息平台”&#xff0c;这将使学生考研的信息平台更加方便和简单。 对于考研信息平台的设计&#xff0c;大多采用java技…