11-12 - 信号发送与处理

news2024/9/30 3:24:13

---- 整理自狄泰软件唐佐林老师课程

查看所有文章链接:(更新中)Linux系统编程训练营 - 目录

文章目录

  • 1. 信号的概念及分类
    • 1.1 问题
    • 1.2 什么是信号
    • 1.3 信号的分类
      • 1.3.1 硬件异常信号
      • 1.3.2 终端相关信号
      • 1.3.3 软件相关信号
    • 1.4 内核与信号
    • 1.5 System V vs BSD
  • 2. 信号发送与处理
    • 2.1 信号处理
      • 2.1.1 信号的默认处理
      • 2.1.2 自定义信号处理
      • 2.1.3 信号处理示例
    • 2.2 信号发送
      • 2.2.1 自定义信号发送
      • 2.2.2 信号发送示例
    • 2.3 编程实验:信号发送与处理
  • 3. 信号处理三大特性
    • 3.1 问题
    • 3.2 信号的OneShot 性
    • 3.3 信号的自身屏蔽特性
    • 3.4 系统调用重启特性
    • 3.5 默认signal函数的特性
    • 3.6 编程实验:三种特性实验
      • 3.6.1 oneshot 实验
      • 3.6.2 信号的自身屏蔽特性(信号重入)实验
      • 3.6.3 系统调用重启实验
      • 3.6.4 处理A收到B
    • 3.7 注意事项
    • 3.8 小结
  • 4. 初探现代信号处理
    • 4.1 现代信号处理注册函数
      • 4.1.1 现代信号处理语义分析
      • 4.1.2 信号状态小知识
      • 4.1.3 信号屏蔽 vs 信号阻塞
    • 4.2 现代信号处理注册示例
    • 4.3 编程实验:现代信号处理
      • 4.3.1 oneshot
      • 4.3.2 屏蔽&阻塞相关
      • 4.3.3 系统调用重启
      • 4.3.4 处理A收到B
      • 4.3.5 signal实际调用sigaction
  • 5. 现代信号发送与处理
    • 5.1 sigqueue
    • 5.2 现代信号处理函数的关键参数
    • 5.3 现代信号发送处理示例
    • 5.4 编程实验:现代信号发送
    • 5.5 思考

1. 信号的概念及分类

1.1 问题

  • 按下ctrl+c后,命令行的前台进程会被终止,why?

1.2 什么是信号

  • 信号是一种 “软件中断”,用来处理异步事件
    • 内核发送信号到某个进程,通知进程事件的发生
    • 事件可能来自硬件,可能来自用户输入,可能来自程序自身错误(如除零错误等)
  • 信号是一种类型的 进程间通信方式一个进程向另一个进程发送信号
    • A进程发生事件T,向B进程发送信号,B进程执行动作响应事件
    • 进程可以对接收到的 不同信号 进行 不同动作响应 (信号,处理)

1.3 信号的分类

  • 硬件异常
    内核检测到硬件错误,发送相应信号给相关进程
  • 终端信号(用户交互信号)
    在终端输入“特殊字符”等价于向前台进程组发送相应的信号
  • 软件信号
    在软件层面(进程代码中)触发的信号(发送给自身或其它进程)

1.3.1 硬件异常信号

在这里插入图片描述

1.3.2 终端相关信号

  • SIGINT(ctrl+c)
    • 程序终止信号,用于通知前台进程组终止进程
  • SIGQUIT(ctrl+\)
    • 与SIGINT类似,进程收到该信号退出时可产生coredump文件
  • SIGTSTP(ctrl+z)
    • 停止进程的运行,进程收到该信号后可以选择处理和忽略
    • 进程收到该信号后停止运行(状态发生转换),后续可恢复运行状态

1.3.3 软件相关信号

  • 子进程退出:父进程收到SIGCHLD信号
  • 父进程退出:子进程可能收到信号(什么信号?)
  • 定时器到期:alarm(),ualarm(),timer_create(),……
  • 主动发送信号:kill(),raise(),……
  • ……

1.4 内核与信号

在这里插入图片描述

1.5 System V vs BSD

  • System V:也被称为AT&T SystemV,是Unix操作系统众多版本中的一支
  • BSD:加州大学伯克利分校开创,Unix衍生系统,代表由此派生出的各种套件组合

Linux之所以被称为类Unix操作系统,部分原因就是Linux的操作风格是介于上述二者之间,且不同厂商为了照顾不同的用户,其发行版本的操作风格存在差异
在这里插入图片描述

2. 信号发送与处理

2.1 信号处理

2.1.1 信号的默认处理

在这里插入图片描述

2.1.2 自定义信号处理

在这里插入图片描述

#include <sys/types.h>
#include <signal.h>
typedef void(*sighandler_t)(int);
sighandler_t signal(int signum, sighandler_t handler);
sighandler_t sysv_signal(int signum, sighandler_t handler);
sighandler_t bsd_signal(int signum, sighandler_t handler);

2.1.3 信号处理示例

在这里插入图片描述

2.2 信号发送

2.2.1 自定义信号发送

在这里插入图片描述

#include <sys/types.h>
#include <signal.h>
int kill(pid_t pid, int sig); 
int raise(int sig); // 信号处理完毕后返回

标准信号是Unix系统中的信号,编号范围从1到31
实时信号是Linux独有的信号,编号范围从32到64

  • kill和raise是用来发送信号的:
    • raise把信号发送给(进程)自身
    • kill把信号发送给进程或进程组
      • pid > 0,将信号传给进程识别码为pid 的进程。
      • pid == 0,将信号传给和目前进程相同进程组的所有进程
      • pid == -1,将信号广播传送给系统内所有的进程
      • pid < 0,将信号传给进程组识别码为pid绝对值的所有进程

2.2.2 信号发送示例

在这里插入图片描述

2.3 编程实验:信号发送与处理

【参看链接】:11-12 - 信号发送与处理 / 11 / 00信号处理 / main.c

在这里插入图片描述
在这里插入图片描述

【参看链接】:11-12 - 信号发送与处理 / 11 / 01信号发送

在这里插入图片描述
在这里插入图片描述

3. 信号处理三大特性

3.1 问题

  • 三种注册信号与处理函数的方法有什么区别?

3.2 信号的OneShot 性

  • System V风格的signal函数,注册的 信号处理是 一次性的
    • 进程收到信号后,调用由signal注册的处理函数
    • 处理函数一旦执行之后,进程通过默认的方式处理后续相同信号
    • 如果想要重复触发,那么必须再次调用signal注册处理函数
  • BSD风格的signal函数不存在OneShot,能够自动反复触发处理函数的调用
  • 默认的signal函数和BSD风格的signal函数一致

3.3 信号的自身屏蔽特性

  • 在信号处理函数执行期间(还未处理结束),很可能再次收到当前信号
    即:处理 A 信号的时候,再次收到 A 信号

  • 对于 System V 风格的 signal 函数,会引起信号处理函数的重入
    即:调用处理函数的过程中,再次收到同个信号触发信号处理函数的调用
    在这里插入图片描述

  • 在注册信号处理函数时:

    • System V风格的signal不屏蔽任何信号
    • BSD风格的signal会屏蔽当前注册的信号,即:再次收到同个信号时,等待第一次收到的信号的处理函数执行完之后,再触发第二次的信号处理函数的调用
  • 思考:BSD风格的signal函数,处理A信号期间,如果收到B信号会发生什么?

3.4 系统调用重启特性

  • 系统调用期间,可能收到信号,此时进程必须从系统调用中返回
  • 对于执行时间较长的系统调用( write / read),被信号中断的可能性很大
  • 如果希望信号处理之后,被中断的系统调用能够重启,则:
    可以通过条件errno == EINTR判断手动重启系统调用
  • 系统调用重启示例代码(wait)

在这里插入图片描述

  • 系统调用重启特性:
    • System V 风格的 signal 函数:(手工重启)
      系统调用被信号中断后,直接返回 -1,并且 errno == EINTR
    • BSD 风格的 signal 函数:(自动重启)
      系统调用被中断,内核在信号处理函数结束后,自动重启系统调用

3.5 默认signal函数的特性

对于大多数的Linux发行版本来说,默认signal函数的行为和BSD风格的signal函数一致

3.6 编程实验:三种特性实验

3.6.1 oneshot 实验

【参看链接】:11-12 - 信号发送与处理 / 12 / 00oneshot

在这里插入图片描述
在这里插入图片描述

3.6.2 信号的自身屏蔽特性(信号重入)实验

【参看链接】:11-12 - 信号发送与处理 / 12 / 01信号重入

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

3.6.3 系统调用重启实验

【参看链接】:11-12 - 信号发送与处理 / 12 / 02系统调用重启

在这里插入图片描述
在这里插入图片描述

3.6.4 处理A收到B

  • BSD风格的signal函数,处理A信号期间,如果收到B信号会发生什么?

【参看链接】:11-12 - 信号发送与处理 / 12 / 03bsd_处理A时再收到B

在这里插入图片描述
在这里插入图片描述

3.7 注意事项

  • 并非所有的系统调用对信号中断都表现同样的行为
    • 一些系统调用支持信号中断后自动重启
      read() , write() , wait() , waitpid() , ioctl() , …
    • 一些系统调用完全不支持信号中断后自动重启
      poll() , select() , usleep() , …

3.8 小结

  • 三种方法的区别:

在这里插入图片描述

在信号处理上,Linux系统更接近BSD风格的操作;默认的signal函数在不同的Linux发行版上语义可能不同,从代码移植性角度,避免直接使用signal(…)函数。

4. 初探现代信号处理

4.1 现代信号处理注册函数

在这里插入图片描述

4.1.1 现代信号处理语义分析

在这里插入图片描述

  • 信号屏蔽与标记:
    • sigset_t sa_mask
      • 信号屏蔽:sa_mask = SIGHUP | SIGINT | SIGUSR1;
      • 注意:并不是所有信号都可以被屏蔽,如:SIGKILL , SIGSTOP
    • int sa_flags
      • 信号特性:sa_flags = SA_ONESHOT | SA_RESTART;
      • 特殊特性(SA_SIGINFO),信号处理时能够收到额外的附加信息

4.1.2 信号状态小知识

  • 信号 产生
    • 信号来源,如:SI_KERNEL , SI_USER , SI_TIMER , …
  • 信号 未决
    • 从信号产生到信号被进程接受的状态(处于未决状态的信号必然已存在)
  • 信号 递达
    • 信号送达进程,被进程接收(忽略,默认处理,自定义处理

4.1.3 信号屏蔽 vs 信号阻塞

  • 信号屏蔽 ==> 信号未决
    • 信号处理函数执行期间,被屏蔽的信号不会被递送给进程(针对多个信号)
    • sa_mask = SIGHUP | SIGINT | SIGUSR1;
  • 信号阻塞 ==> 信号未决
    • 信号处理函数执行期间,当前信号不会递送给进程(当前信号)
    • act.sa_flags = SA_RESTART | SA_NODEFER;

在这里插入图片描述

4.2 现代信号处理注册示例

在这里插入图片描述

4.3 编程实验:现代信号处理

【参看链接】:11-12 - 信号发送与处理 / 12 / 04现代信号处理

4.3.1 oneshot

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

4.3.2 屏蔽&阻塞相关

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

4.3.3 系统调用重启

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

4.3.4 处理A收到B

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

4.3.5 signal实际调用sigaction

在这里插入图片描述
在这里插入图片描述

5. 现代信号发送与处理

5.1 sigqueue

在这里插入图片描述

  • sigqueue(…)的黄金搭档是sigaction(…)
  • sa_flags设置 SA_SIGINFO 标志位,可使用 三参数 信号处理函数

在这里插入图片描述

5.2 现代信号处理函数的关键参数

在这里插入图片描述

5.3 现代信号发送处理示例

在这里插入图片描述

5.4 编程实验:现代信号发送

【参看链接】:11-12 - 信号发送与处理 / 12 / 05现代信号发送

在这里插入图片描述

在这里插入图片描述

5.5 思考

  • 利用信号搞进程间通信靠谱吗???

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

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

相关文章

组合模式(Composite)

别名 对象树&#xff08;Object Tree&#xff09;。 定义 组合是一种结构型设计模式&#xff0c;你可以使用它将对象组合成树状结构&#xff0c;并且能像使用独立对象一样使用它们。 前言 1. 问题 如果应用的核心模型能用树状结构表示&#xff0c;在应用中使用组合模式才…

彭博:为完善Vision Pro体验,苹果扩招数千名新员工

彭博社记者Mark Gurman在最新一期Power On栏目中表示&#xff0c;苹果在WWDC 2023上公布Vision Pro头显&#xff0c;只是该公司进入XR市场的第一步&#xff0c;实际上该设备在明年才会推出完整版。而且据项目相关人士透露&#xff0c;Vision Pro的软件生态还需要很长时间发展。…

软件工程——第6章详细设计知识点整理

本专栏是博主个人笔记&#xff0c;主要目的是利用碎片化的时间来记忆软工知识点&#xff0c;特此声明&#xff01; 文章目录 1.详细设计阶段的根本目的是&#xff1f; 2.详细设计的任务&#xff1f; 3.详细设计的结果地位&#xff1f;如何衡量程序质量&#xff1f; 4.结构程…

在GitHub上爆火!跳槽必看《Java 面试突击核心讲》知识点笔记整理

不知道大家在面试中有没有这种感觉&#xff1a;面试官通常会在短短两小时内对面试者的知识结构进行全面了解&#xff0c;面试者在回答问题时如果拖泥带水且不能直击问题的本质&#xff0c;则很难充分表现自己&#xff0c;最终影响面试结果。 所以针对这种情况&#xff0c;这份…

从0到1精通自动化测试,pytest自动化测试框架,使用自定义标记mark(十一)

一、前言 pytest可以支持自定义标记&#xff0c;自定义标记可以把一个web项目划分多个模块&#xff0c;然后指定模块名称执行 app自动化的时候&#xff0c;如果想android和ios公用一套代码时&#xff0c;也可以使用标记功能&#xff0c;标明哪些是ios用例&#xff0c;哪些是a…

除静电设备给我们的生产带来怎样的便利

一般来说&#xff0c;我们需要根据具体的生产工艺和场景选择适当的静电设备&#xff0c;并按照厂商提供的操作规范正确使用&#xff0c;以确保除静电设备有效发挥作用。 1. 静电消除&#xff1a;静电设备可以帮助消除物体表面的静电电荷&#xff0c;防止静电积聚。静电积聚可能…

UML类图设计

1.普通类&#xff0c;抽象类&#xff0c;接口 普通类 抽象类 接口 1 关联关系 依赖关系 关联&#xff1a;对象之间的引用关系 依赖&#xff1a;耦合性最低&#xff0c;一些静态方法等 2 聚合关系 组合关系 聚合&#xff1a;整体与部分的关系&#xff0c;但是部分可以脱…

英特尔 oneAPI 2023 黑客松大赛:赛道二机器学习:预测淡水质量 实践分享

目录 一、问题描述二、解决方案1、方案简述2、数据分析预处理特征类型处理特征分布分析 3、特征构造4、特征选择过滤法重要性排序 5、模型训练 总结未来工作 一、问题描述 淡水是我们最重要和最稀缺的自然资源之一&#xff0c;仅占地球总水量的 3%。它几乎触及我们日常生活的方…

Python:pyecharts可视化

文章目录 简介Geo地理图绘制折线图区域突出显示横坐标带选择展示 add地图Mapformatter控制value显示在图中显示value值目标html的解析自定义地图js资源原生地图js的解析解决省份上文字不居中的问题 桑基图设置桑基柱的颜色 参考文献 简介 &#xff08;这是20年的笔记&#xff…

医疗陪诊小程序开发功能有哪些?

医疗陪诊系统开发功能有哪些&#xff1f; 1、注册登录。用户初次使用需使用个人手机号码或者是第三方社交账号进行注册登录&#xff0c;登陆之后填写个人相关信息&#xff0c;姓名、性别、年龄、过往病史、病历等信息&#xff0c;以便医生可以根据患者资料进行初步判断。…

小文智能自定义变量详解

在小文交互场景设计时&#xff0c;有一个特殊功能&#xff0c;叫做自定义变量。有时&#xff0c;根据外呼对象的不同&#xff0c;需要对用户传达不同的内容&#xff0c;比如称呼、地址、公司名称等等。此时&#xff0c;就可以使用小文交互的自定义变量功能来实现对不同用户呼出…

Destination unreachable(Port unreachable) 错误原因和解决办法

Destination unreachable(Port unreachable) 是一条由网络设备&#xff08;如路由器或防火墙&#xff09;生成的ICMP&#xff08;Internet Control Message Protocol&#xff09;错误消息&#xff0c;用于通知源设备目标设备或端口无法到达。 一、什么是ICMP ICMP&#xff08;I…

【中危】Guava<32.0.0 存在竞争条件漏洞

漏洞描述 Guava 是 Google 公司开发的开源 Java 代码库&#xff0c;提供常用的Java工具和数据结构。 Guava 1.0 至 31.1 版本中的 FileBackedOutputStream 类使用Java的默认临时目录创建文件&#xff0c;由于创建的文件名容易被攻击者猜测&#xff0c;在 Unix 和 Android Ice…

静电设备在静电处理环节中的原理

静电设备在静电处理环节中发挥着重要的作用。以下是一些常见的静电设备及其作用&#xff1a; 1. 静电消除器&#xff1a;静电消除器通过释放相等数量的正负离子&#xff0c;有效地中和周围环境中的静电荷&#xff0c;从而减少或消除静电引起的问题&#xff0c;例如静电吸附、电…

AI科技的应用革命:改变生活方式、提升人类生产力

人工智能技术的发展和应用&#xff0c;正在对我们的生活方式产生深远的影响。无论是在家庭、工作还是娱乐方面&#xff0c;越来越多的AI工具正在改变我们的习惯、观念和行为。它们为我们提供了更加智能化、个性化和定制化的服务和产品&#xff0c;让我们的生活变得更加便捷、高…

NXP i.MX 8M Plus工业核心板硬件说明书( 四核ARM Cortex-A53 + 单核ARM Cortex-M7,主频1.6GHz)

1 硬件资源 创龙科技SOM-TLIMX8MP是一款基于NXP i.MX 8M Plus的四核ARM Cortex-A53 单核ARM Cortex-M7异构多核处理器设计的高端工业核心板&#xff0c;ARM Cortex-A53(64-bit)主处理单元主频高达1.6GHz&#xff0c;ARM Cortex-M7实时处理单元主频高达800MHz。处理器…

【教程】Flutter与Rust完美交互,无需手写FFI代码

实践环境&#xff1a;Windows11 flutter_rust_bridge官方文档 Flutter环境配置教程 | Rust环境配置教程 新建一个全新的Flutter项目并运行&#xff1a; flutter create example && cd example && flutter run 在Flutter项目根目录新建一个Rust项目&#xf…

从0到1精通自动化,接口自动化测试——数据驱动DDT实战

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 DDT简介 名称&am…

FPGA解码 MIPI 视频 OV4689采集 4line 2.7K分辨率 提供工程源码和技术支持

目录 1、前言2、Xilinx官方主推的MIPI解码方案3、本 MIPI CSI2 模块性能及其优越性4、我这里已有的 MIPI 编解码方案5、vivado工程介绍5、上板调试验证6、福利&#xff1a;工程代码的获取 1、前言 FPGA图像采集领域目前协议最复杂、技术难度最高的应该就是MIPI协议了&#xff…

python spider 爬虫 之 解析 xpath 、jsonpath、BeautifulSoup (三)

BeautifulSoup 简称&#xff1a;bs4 BeautifulSoup跟lxml 一样&#xff0c;是一个html文档的解析器&#xff0c;主要功能也是解析和提取数据 优缺点 缺点&#xff1a;效率没有lxml的效率高 优点&#xff1a;接口接口人性化&#xff0c;使用方便 延用了css选择器 安装Beautifu…