第五部分:2---信号的介绍、产生、处理

目录

信号的概念:

信号表的继承:

信号的分类与编号:

特殊的信号:

信号的产生:

1.键盘输入:

2.系统调用:

3.异常或硬件错误:

4.总结:

信号的处理:

1.进程如何得知收到的是哪个信号?

2.进程处理信号的方式:


信号的概念:

  • 信号是进程间通信的一种异步通知机制,用于向目标进程发送通知。

  • 信号的处理是异步的,意味着信号可以在任何时候产生,而进程会在适当时机对信号作出处理。

异步(Asynchronous)是指在编程或系统设计中,任务的执行不需要立即等待其他任务完成,而是可以在不阻塞的情况下继续进行。

信号表的继承:

  • 每个进程都有一张信号表,本质是一个函数指针数组,数组的下标就对应每一个信号。

  • 当使用fork()系统调用创建子进程时,子进程会复制父进程的信号处理表。这意味着父进程如何处理信号,子进程刚被创建时也会如何处理信号。

  • 当一个进程通过 exec() 系列函数进程程序替换时,信号表中的自定义处理方式会恢复为默认处理方式(操作系统定义的默认行为)。

信号的分类与编号:

  • 系统内置了多种信号,每种信号有特定编号。

  • 信号在是线上是以宏的方式实现的,所以使用信号,可以通过信号的宏名也可以通过信号的值。

  • 使用 kill -l 可以查看当前系统支持的所有信号。

  • 使用man 7 signal查看信号详细介绍。

  • 信号分为两类:普通信号(1~31)和实时信号(34~64)。

特殊的信号:

  • 没有 0 号信号,0 常用于表示进程的正常退出。

  • 32 和 33 号信号是为操作系统内部保留的,用户进程不会使用这些信号。

  • 9 号信号 (SIGKILL) 不能被进程捕获或忽略,确保进程可以被强制终止。

信号的产生:

  • 信号可以通过软件、硬件、或者组合键产生。

1.键盘输入:

  • 通过键盘组合键可以产生信号:键盘被按下后,会向 CPU 发送中断,CPU读取到键盘的数据为组合键后,形成具体的按键事件,这个事件包含处理的逻辑,比如发送信号给前台进程。

2.系统调用:

  • 通过 int kill(pid_t pid, int sig); 系统调用可以向任意进程发送任意信号。

  • 通过 int raise(int sig); 函数用于给自身发送任意信号。

  • 通过 void abort(void); 会给自身发送 SIGABRT 信号,6号信号,用于强终止进程,即使使用signal重写了信号的处理方法,进程也会被强制结束。

3.异常或硬件错误:

  • 当出现如段错误或非法指令时,系统会向进程发送相应的信号(如 SIGSEGV),终止进程并清理上下文。

4.总结:

  • 信号的产生方式有很多种,但是信号只能由操作系统发送,进程的管理者OS才有资格修改进程pcb中位图的权限。

信号的处理:

1.进程如何得知收到的是哪个信号?

  • 操作系统中的信号机制类似于软件中的“中断”,当进程收到信号时,操作系统并不会立刻打断进程的执行,它会通过进程的pid查找到该进程的PCB,通过修改进程控制块(PCB)中的一个位图来记录信号,并在进程准备好时再处理这些信号。

  • 在进程的PCB中,通常会包含一个信号位图字段(如uint32_t),用于表示进程当前接收到的信号状态。每一位代表一个特定的信号。

  • 位图中的每个比特位表示一个信号的状态。如果某个信号被发送到进程,则对应信号的比特位被置为1。

  • 位图中的比特位数通常比系统支持的信号数量多出1位,因为信号编号从1开始(位图的第0位通常不用)。

2.进程处理信号的方式:

  • 信号有三种处理方式:默认处理,忽略,自定义处理。

  • 自定义信号处理时,signal函数并不会“截获”信号再调用自定义处理函数,而是直接修改信号表中对应信号的处理函数指针,使得该信号到达时调用自定义的处理函数。

  • 具体来说,操作系统提供的函数,如 signal(int signum, sighandler_t handler);或 sigaction(),允许进程修改信号表,将默认的信号处理函数替换为自定义的处理函数。

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

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

相关文章

两台电脑的对话,Socket网络传输的套件学起来

服务器端from socket import * s socket() s.bind((gethostname(),8888)) s.listen() s, addr s.accept() print(addr) disk_str s.recv(1024).decode() disk_list disk_str.split(\x00) disk_list.pop(-1) print(disk_list) cur_path " " while True:com_str …

计算机组成原理(笔记3)

IEEE754浮点数标准 这里只讲32位单精度 S——尾数符号,0正1负; M——尾数, 纯小数表示, 小数点放在尾数域的最前面。 一般采用原码或补码表示。 E——阶码,采用“移码”表示; 阶符采用隐含方式,即采用“移码”方法来表示正负指数…

Python 之数据库操作(Python Database Operations)

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:Linux运维老纪的首页…

基于SSM的在线家用电器销售系统

作者:计算机学姐 开发技术:SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等,“文末源码”。 专栏推荐:前后端分离项目源码、SpringBoot项目源码、SSM项目源码 系统展示 【2025最新】基于JavaSSMVueMySQL的在线家…

统信服务器操作系统【1050e版】安装手册

统信服务器操作系统1050e版本的安装 文章目录 功能概述一、准备环境二、安装方式介绍安装步骤步骤一:制作启动盘步骤二:系统的安装步骤三:安装引导界面步骤四:图形化界面安装步骤五:选择安装引导程序语言步骤六:进入安装界面步骤七:设置键盘步骤八:设置系统语言步骤九:…

链接升级:Element UI <el-link> 的应用

链接升级&#xff1a;Element UI 的应用 一 . 创建文字链接1.1 注册路由1.2 创建文字链接 二 . 文字链接的属性2.1 文字链接的颜色2.2 是否显示下划线2.3 是否禁用状态2.4 填写跳转地址2.5 加入图标 在本篇文章中&#xff0c;我们将深入探索Element UI中的<el-link>组件—…

Elasticsearch基础(七):Logstash如何开启死信队列

文章目录 Logstash如何开启死信队列 一、确保 Elasticsearch 输出插件启用 DLQ 支持 二、配置 Logstash DLQ 设置 三、查看死信队列 四、排查 CSV 到 Elasticsearch 数据量不一致的问题 Logstash如何开启死信队列 在 Logstash 中&#xff0c;死信队列&#xff08;Dead Le…

一文快速上手-create-vue脚手架

文章目录 初识 create-vuecreate-vue新建项目Vue.js 3 项目目录结构项目的运行和打包vite.config.js文件解析其他&#xff1a;webpack和Vite的区别 初识 create-vue create-vue类似于Vue CLI脚手架&#xff0c;可以快速创建vuejs 3项目&#xff0c;create-vue基于Vite。Vite支…

C++ nullptr 和NULL的区别

个人主页&#xff1a;Jason_from_China-CSDN博客 所属栏目&#xff1a;C系统性学习_Jason_from_China的博客-CSDN博客 所属栏目&#xff1a;C知识点的补充_Jason_from_China的博客-CSDN博客 概念概述&#xff1a; 在C中&#xff0c;nullptr 和 NULL 都是用来表示空指针&#xf…

GPT对话知识库——串口通信的数据的组成?起始位是高电平还是低电平?如何用代码在 FreeRTOS 中实现串口通信吗?如何处理串口通信中的数据帧校验吗?

目录 1&#xff0c;问&#xff1a; 1&#xff0c;答&#xff1a; 串口数据的组成 串口数据传输帧的完整结构 起始位的电平状态&#xff1a;低电平 举例&#xff1a;UART数据传输的例子 适用场景 总结 2&#xff0c;问&#xff1a; 2&#xff0c;答&#xff1a; a. 如…

微波无源器件 功分器3 一种用于多端口辐射单元的紧凑四路双极化正交模功分器的设计

摘要&#xff1a; 一种有着双极化能力并且能作为一个Fabry-Perot谐振腔天线的馈源包含四个输入端口的新型紧凑功分器的概念和设计被提出了。在四个圆波导中的双同相极化通过使用四个5端口十字转门结合两个8by1&#xff08;八合一&#xff09; 功分网络。功分器末端接了两个端口…

【RabbitMQ】工作模式

工作模式概述 简单模式 简单模式中只存在一个生产者&#xff0c;只存在一个消费者。生产者生产消息&#xff0c;消费者消费消息。消息只能被消费一次&#xff0c;也称为点对点模式。 简单模式适合在消息只能被单个消费者处理的场景下存在。 工作队列模式&#xff08;Work Qu…

项目管理 | 一文读懂什么是敏捷开发管理

在快速变化的商业环境中&#xff0c;项目管理方式也在不断演进&#xff0c;其中敏捷开发管理因其高效、灵活和适应性强的特点&#xff0c;逐渐成为众多企业和团队的首选。本文将详细解析敏捷开发管理的定义、具体内容及其核心角色&#xff0c;帮助读者全面理解这一先进的项目管…

心觉:不能成事的根本原因

很多人一直都很努力&#xff0c;每天都很忙 每天都学习很多东西&#xff0c;学习各种道&#xff0c;各种方法论 但是许多年过去了依然一事无成 自己的目标没有达成&#xff0c;梦想没有实现 为什么呢 关键是没有开悟 那么什么是开悟呢 现在很多人都在讲开悟 貌似开悟很…

harmony初学者入门

一、开发前准备 1.申请开发者账号,可进行个人认证和企业认证 2.下载开发者工具&#xff0c;下载最新版本的devecoStudio &#xff0c;当然可以下载历史版本的 3.安装DevEco Studio 4.申请模拟器 并且安装模拟器 在此说明下 有预览器 模拟器和真机&#xff0c; 个人开发学习的话…

阿里云 Quick BI使用介绍

Quick BI使用介绍 文章目录 阿里云 Quick BI使用介绍1. 创建自己的quick bi服务器2. 新建数据源3. 上传文件和 使用4. 开始分析 -选仪表盘5. 提供的图表6. 一个图表的设置使用小结 阿里云 Quick BI使用介绍 Quick BI是一款全场景数据消费式的BI平台&#xff0c;秉承全场景消费…

AI逻辑推理入门

参考数据鲸 (linklearner.com) 1. 跑通baseline 报名 申领大模型API 模型服务灵积-API-KEY管理 (aliyun.com) 跑通代码 在anaconda新建名为“LLM”的环境,并安装好相应包后,在jupyter notebook上运行baseline01.ipynb 2. 赛题解读 一般情况下,拿到一个赛题之后,我们需…

C++系列-匿名对象

匿名对象 &#x1f4a2;什么是匿名对象&#x1f4a2;匿名对象的创建方式及作用域&#x1f4a2;匿名对象的对象类型&#x1f4a2;&#x1f4a2;匿名的基本数据类型对象&#x1f4a2;&#x1f4a2;匿名的自定义的类类型对象&#x1f4a2;&#x1f4a2;匿名的标准库的类对象 &…

CleanClip vs 传统剪贴板:究竟谁更胜一筹?

在日常工作和生活中,复制粘贴可以说是我们使用最频繁的操作之一。传统的剪贴板功能虽然简单易用,但在功能性和效率上还有很大的提升空间。今天,我们就来比较一下新兴的剪贴板增强工具CleanClip与传统剪贴板,看看到底谁更胜一筹。 1. 剪贴历史管理 传统剪贴板只能存储最后一次…

通过adb命令打开手机usb调试

adb shell settings put global adb_enabled 1 这个命令会将全局ADB启用设置为1&#xff0c;允许通过ADB进行调试。 adb shell settings put secure adb_authentication_enabled 1 这个命令会启用ADB身份验证&#xff0c;允许设备在连接时要求授权。 adb shell settings put …