当前位置: 首页 > news >正文

进程信号的产生与处理

目录

前言

一.信号的概念

二.信号的产生

1.键盘产生

2.系统调用

3.软件条件

4.异常

三.信号的保存

四.信号的处理

信号处理的方式

设定屏蔽信号

自定义处理信号

信号处理的时机


前言

        进程信号(Process Signals)是操作系统与运行进程之间进行通信的一种机制。信号通常用于通知进程发生了某些事件,如异常情况、硬件事件、系统调用的错误或用户发出的中断请求。信号的处理方式与异常处理类似,它允许进程在接收到信号时,暂时中断当前的执行流程,以处理特定的事件,  学习进程的信号有利于我们理解程序的运行情况

一.信号的概念

信号是Linu×系统提供让用户(进程)给其他进程发送异步信息的一种方式,属于软中断

进程在接收到信号时,暂时中断当前的执行流程,以处理特定的事件

使用kill -l 命令查看全部信号

[1,31]信号是非实时信号,  进程收到信号后选择在合适的时间处理

[34,64]信号是实时信号,  进程收到信号后需要马上处理

这些信号也是一个个宏定义,

#define	SIGINT		2	/* Interactive attention signal.  */
#define	SIGILL		4	/* Illegal instruction.  */
#define	SIGABRT		6	/* Abnormal termination.  */
#define	SIGFPE		8	/* Erroneous arithmetic operation.  */
#define	SIGSEGV		11	/* Invalid access to storage.  */
#define	SIGTERM		15	/* Termination request.  *//* Historical signals specified by POSIX. */
#define	SIGHUP		1	/* Hangup.  */
#define	SIGQUIT		3	/* Quit.  */
#define	SIGTRAP		5	/* Trace/breakpoint trap.  */
#define	SIGKILL		9	/* Killed.  */
#define SIGBUS		10	/* Bus error.  */
#define	SIGSYS		12	/* Bad system call.  */
#define	SIGPIPE		13	/* Broken pipe.  */
#define	SIGALRM		14	/* Alarm clock.  */

二.信号的产生

1.键盘产生

        比如程序在前台运行的时候,  我们中止这个进程会直接ctrl+c,  或者ctrl+/,  这些都会被识别为信号处理Ctrl+c 会被识别为SIGINT,  Ctrl+/会被识别为SIGQUIT

        使用键盘输入的时候,  键盘控制器(通常是PS/2或USB控制器)会生成一个硬件中断信号。这个信号会通过系统总线传递给CPU  触发硬件中断,  CPU就会去中断向量表中执行对应的方法,  读取键盘输入,  最后判断键盘输入,  如果解释为字符就进行写入,  如果解释为信号就向对应的进程写入信号

2.系统调用

使用系统调用发送信号

向一个指定进程发送信号

向自己发送指定信号

向自己发送SIGABRT(6)信号

3.软件条件

比如这个是一个闹钟

设定闹钟,时间到了向自己发SIGALRM(14)信号

如果闹钟已经设定,  则返回上个闹钟的剩余时间

4.异常

比如

SIGFPE(8) 浮点数错误

SIGSEGV(11) 段错误

cpu在计算的是否如果出现异常,  就会对自己发生硬件中断,  使得操作系统来处理这些异常,  

比如发生除0错误,  cpu计算错误,  寄存器里有状态标识寄存器,  OS识别到这个标记就会执行相对应的方法操作系统就会给该进程写入SIGFPE信号

发生越界访问就会写入SIGSEGV信号

三.信号的保存

信号保存在进程的PCB中,  采用位图结构保存,  所谓发送信号就是OS向进程的PCB写入信号

  • 实际执行信号的处理动作称为信号递达(Delivery)
  • 信号从产生到递达之间的状态,称为信号未决(Pending)
  • 进程可以选择阻塞 (Block )某个信号。
  • 被阻塞的信号产生时将保持在未决状态,直到进程解除对此信号的阻塞,才执行递达的动作.
  • 注意,阻塞和忽略是不同的,只要信号被阻塞就不会递达,而忽略是在递达之后可选的一种处理动作。

进程收到的信号会被保存在pending表,  如果接收到这个信号,  就置为1

block表表示这个信号是否被忽略

handler表示这个信号处理的动作

四.信号的处理

信号处理的方式

1.默认处理

2.自定义处理

3.忽略

使用 man 7 signal来查看信号的默认处理

Term   直接中止进程
Ign    不做处理
Core   核心转储
Stop   暂停进程
Cont   如果该进程当前已暂停,则继续该进程.

设定屏蔽信号

信号集操作函数

设置信号屏蔽

how常用选项

  • SIGBLOCK:  表示要添加忽略处理的信号
  • SIGUNBLOCK:  表示将这些信移出block表
  • SIGSETMASK:  表示直接将屏蔽信号修改为传入的信号集

可以使用sigpending获得pending表

自定义处理信号

对指定信号自定义处理

handler:  一个函数指针,   表示要执行的自定义函数

比如将SIGINT信号自定义处理

#include<iostream>
#include<signal.h>
void handler(int sig)
{//自定义处理
}int main()
{signal(SIGINT,handler);return 0;
}

之后进程收到这个信号就会直接执行handler函数

如果需要忽略这个信号

signal(SIGINT,SIG_IGN);

信号处理的时机

进程从内核态切换到用户态的时候OS会检测处理信号

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • C语言编译和链接超详解
  • 【卡梅德生物】鼠单B细胞筛选技术及其在鼠单抗生产中的应用
  • 【知识专栏丨python数分实战】天猫订单数据分析及可视化|taobao天猫订单接口
  • 【HBZ分享】Spring启动时核心refresh方法流程
  • 0022__gitbash中文乱码显示数字问题
  • SQL注入漏洞的防范措施
  • 为什么选择在Facebook投放广告?
  • 【数据结构与算法 | 哈希表篇】力扣387
  • 4.mysql约束
  • 【数据结构与算法】哈希表
  • JAVA—异常
  • 深度学习入门指南(1) - 从chatgpt入手
  • Docker③_VMware虚拟机和Docker的备份与恢复
  • CST软件如何设置硬件加速选项GPU DCMPI token?
  • (自用)交互协议设计——protobuf序列化
  • Android Studio:GIT提交项目到远程仓库
  • Docker 1.12实践:Docker Service、Stack与分布式应用捆绑包
  • Hibernate最全面试题
  • JavaScript 基础知识 - 入门篇(一)
  • Javascript 原型链
  • k8s 面向应用开发者的基础命令
  • MySQL的数据类型
  • SpingCloudBus整合RabbitMQ
  • windows下mongoDB的环境配置
  • 前端自动化解决方案
  • 浅谈Kotlin实战篇之自定义View图片圆角简单应用(一)
  • SAP CRM里Lead通过工作流自动创建Opportunity的原理讲解 ...
  • !!【OpenCV学习】计算两幅图像的重叠区域
  • #include到底该写在哪
  • $.extend({},旧的,新的);合并对象,后面的覆盖前面的
  • (11)MSP430F5529 定时器B
  • (3)llvm ir转换过程
  • (30)数组元素和与数字和的绝对差
  • (51单片机)第五章-A/D和D/A工作原理-A/D
  • (C语言)深入理解指针2之野指针与传值与传址与assert断言
  • (zt)最盛行的警世狂言(爆笑)
  • (板子)A* astar算法,AcWing第k短路+八数码 带注释
  • (纯JS)图片裁剪
  • (附源码)计算机毕业设计SSM智能化管理的仓库管理
  • (力扣题库)跳跃游戏II(c++)
  • (五)c52学习之旅-静态数码管
  • (原創) 如何安裝Linux版本的Quartus II? (SOC) (Quartus II) (Linux) (RedHat) (VirtualBox)
  • (最完美)小米手机6X的Usb调试模式在哪里打开的流程
  • ****** 二十三 ******、软设笔记【数据库】-数据操作-常用关系操作、关系运算
  • *ST京蓝入股力合节能 着力绿色智慧城市服务
  • ..回顾17,展望18
  • .mp4格式的视频为何不能通过video标签在chrome浏览器中播放?
  • .NET CF命令行调试器MDbg入门(二) 设备模拟器
  • .Net Core 微服务之Consul(二)-集群搭建
  • .NET I/O 学习笔记:对文件和目录进行解压缩操作
  • .NET 发展历程
  • .NET 实现 NTFS 文件系统的硬链接 mklink /J(Junction)
  • .NET 中 GetProcess 相关方法的性能
  • .NET开源快速、强大、免费的电子表格组件
  • .net通过类组装数据转换为json并且传递给对方接口