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

news2024/12/25 12:38:52

目录

信号的概念:

异步的概念:

信号的3种处理方式:

修改2号信号为自定义信号处理:

​编辑

信号捕捉后恢复和信号的忽略:

信号的分类与编号:

特殊的信号:

进程信号表的继承:

进程管理收到的普通信号:

系统调用kill向进程发送信号:

系统调用raise向自己发送信号:

系统调用abort向自己发送6号信号:

信号的产生方式:

异常产生信号:

发送信号的本质:


信号的概念:

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

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

异步的概念:

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

信号的3种处理方式:

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

  • 信号的捕捉,就是对信号设置自定义信号函数,signal函数会直接修改信号表中对应信号的处理函数指针,使其指向自定义信号处理函数。

#include<signal.h> //signal函数使用需要包含的头文件
typedef void (*sighandler_t)(int);
sighandler_t signal(int signum, sighandler_t handler);

修改2号信号为自定义信号处理:

#include<iostream> 
#include<unistd.h> //使用sleep
#include<signal.h> //使用signal
#include<cstdlib> //使用exit
using namespace std;
​
void signalHandle(int signum) //返回值必须为void,参数必须为int
{
    cout<<"收到信号"<<signum<<endl;
    exit(1);
}
​
int main()
{
    signal(2,signalHandle); //将2号信号设置自定义处理函数
    while(true)
    {
        cout<<"等待接收信号..."<<endl;
        sleep(1);
    }
    return 0;
}

信号捕捉后恢复和信号的忽略:

signal(int signum,SIG_IGN); //SIG_IGN:忽略该信号。
signal(int signum,SIG_DFL); //SIG_DFL:恢复为信号的默认处理方法(之前设置的处理函数将作废)。

信号的分类与编号:

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

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

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

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

特殊的信号:

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

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

  • 9 号信号 (SIGKILL) 不能被进程捕获或忽略,称为“管理员信号”,确保进程可以被强制终止。

进程信号表的继承:

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

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

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

进程管理收到的普通信号:

  • 进程收到某个信号,操作系统不会立即中断进程的执行,而是先记录该信号。当进程进入内核态时,操作系统会检查是否有待处理的信号,并根据优先级和进程的状态决定何时处理这些信号。

  • 操作系统会使用一个位图来表示进程接收到的信号状态。位图中的每一位对应一个信号编号,通常信号编号从1开始。因此位图第0位是不用的。当对应位置为1时表示进程收到该信号,为0时表示进程没有收到对应信号。

  • 位图的比特位数需要覆盖所有可能的信号。现代Linux系统中支持的信号通常远超过32个,所以可能需要使用多个uint32_t或更大的数据结构(如sigset_t)来存储信号。

系统调用kill向进程发送信号:

#include <signal.h> //头文件包含
int kill(pid_t pid, int sig); //向pid进程发送sig信号

系统调用raise向自己发送信号:

#include <signal.h>  //头文件包含
int raise(int sig); //向自己发送sig信号,相当于kill(getpid(),sig);

系统调用abort向自己发送6号信号:

#include <stdlib.h> 
void abort(void); //给自身发送6号信号强终止自己,即使使用signal重写了信号的处理方法,进程也会被强制结束。

信号的产生方式:

  • 信号的产生方式主要有三种:

  • 在linux下,通过特殊的键盘组合键可以产生信号,如上

  • 通过一些系统调用可以产生信号。如上

  • 程序运行过程中,某些程序异常会自动产生异常信号,如下

异常产生信号:

  • 非法访问内存:当程序试图访问无效的内存地址时,会产生 SIGSEGV 信号(分段错误)。

  • 浮点运算异常:当程序发生非法的浮点运算(如除以零)时,会产生 SIGFPE 信号。

  • 非法指令:当程序试图执行非法或未知的指令时,会产生 SIGILL 信号。

  • 总线错误:当程序发生不对齐的内存访问等硬件错误时,会产生 SIGBUS 信号。

  • 断管(Broken Pipe):当进程向一个没有读取端的管道写入数据时,会产生 SIGPIPE 信号。

发送信号的本质:

  • 操作系统向进程发送信号,本质上是操作系统修改进程pcb的位图。

  • 只有操作系统可以向进程发送信号,因为操作系统才是内核数据结构的管理者。

  • 因此,上述产生信号的方式虽然有几种,但是信号的发送者只能是操作系统。

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

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

相关文章

标准 I/O

标准 I/O 引言 I/O 是一切实现的基础&#xff0c;其分为标准 I/O 和文件 I/O。 文件 I/O 依赖操作系统&#xff0c;因系统的实现方式而定&#xff0c;对于程序员来说会造成很大困扰。如打开文件&#xff0c;Linux 系统调用为 open() 函数&#xff0c;而 Windows 的系统调用为…

在新ARM板上移植U-Boot和Linux指南

序言 从支持一个定制板子在U-Boot和Linux中的过程中得到经验以一个带有知名SoC&#xff08;i.MX6&#xff09;且IP已经得到支持的板子为例&#xff0c;这次讨论几乎不涉及编码技能&#xff0c;更多地聚焦在U-Boot部分 一般原则 如果您有您的BSP&#xff08;板级支持包&#…

推荐、nlp、算法题等相关复习(0922-0929)

1. 算法题&#xff1a;路径总和三 求一棵树中所有路径和为targetsum的值&#xff0c;其实有点像和为k的数组&#xff0c;用前缀和来做 先求出前缀和数组&#xff0c;再类似两数之和问题&#xff0c;每次插入一个数&#xff0c;如果target-当前数在哈希表里存在&#xff0c;更…

Vscode: reason: oom, code: -536870904

最近使用github+插件github copilot开发时遇到这个问题, 出现原因:在chat窗口输入了过大的内容。 现象是:每次打开vscode后正常,且打开其他文件夹,再打开chat窗口运行正常。但当再次打开原来的文件夹并打开chat窗口时,则出现此崩溃问题。 尝试以下办法: 1、将D盘虚拟…

Android——添加联系人

概述 第一步 往手机联系人应用中的raw_contacts表添加一条记录 raw_contacts表 ContentValues values new ContentValues();// 往 raw_contacts 添加联系人记录&#xff0c;并获取添加后的联系人编号Uri uri resolver.insert(ContactsContract.RawContacts.CONTENT_URI, …

AI绘画相似风格的作品

目标&#xff1a;根据一张图风格&#xff0c;画出更好的图片 步骤一 等待几分钟&#xff0c;就出来了&#xff0c;点击获取第一个关键词并复制 然后会得到这个四张图片 选中其中的一张&#xff0c;比如第一张 很快就拿到了结果

图解FTP服务器配置:实体用户方式访问案例

任务要求&#xff1a; 某企业搭建一个内部ftp服务器&#xff0c;要求实现如下功能&#xff1a; 用户登录时显示一些欢迎信息&#xff1b;系统账户root、bin不能登录主机&#xff1b;实体用户ligang、liuqiang能够登录ftp服务器&#xff1b;实体用户ligang、liuqiang不能登录本…

数据治理005-血缘关系

数据血缘是元数据产品的核心能力&#xff0c;但数据血缘是典型的看起来很美好但用起来门槛很高的技术&#xff0c;只要你采买过元数据产品就知道了。这篇文章对数据血缘的特征、价值、用途和方法做了系统阐述&#xff1a; 1、特征&#xff1a;归属性、多源性、可追溯及层次性 2…

DOM元素导出图片与PDF:多种方案对比与实现

背景 在日常前端开发中&#xff0c;经常会有把页面的 DOM 元素作为 PNG 或者 PDF 下载到本地的需求。例如海报功能&#xff0c;简历导出功能等等。在我们自家的产品「代码小抄」中&#xff0c;就使用了 html2canvas 来实现代码片段导出为图片&#xff1a; 是不是还行&#xff…

【项目经验分享】深度学习自然语言处理技术毕业设计项目案例定制

以下毕业设计是与深度学习自然语言处理&#xff08;NLP&#xff09;相关的毕业设计项目案例&#xff0c;涵盖文本分类、生成式模型、语义理解、机器翻译、对话系统、情感分析等多个领域&#xff1a; 实现案例截图&#xff1a; 基于深度学习的文本分类系统基于BERT的情感分析系…

RabbitMQ 界面管理说明

1.RabbitMQ界面访问端口和后端代码连接端口不一样 界面端口是15672 http://localhost:15672/ 后端端口是 5672 默认账户密码登录 guest 2.总览图 3.RabbitMq数据存储位置 4.队列 4.客户端消费者连接状态 5.队列运行状态 6.整体运行状态

【SpringCloud】环境和工程搭建

环境和工程搭建 1. 案例介绍1.1 需求1.2 服务拆分服务拆分原则服务拆分⽰例 1. 案例介绍 1.1 需求 实现⼀个电商平台(不真实实现, 仅为演⽰) ⼀个电商平台包含的内容⾮常多, 以京东为例, 仅从⾸⻚上就可以看到巨多的功能 我们该如何实现呢? 如果把这些功能全部写在⼀个服务…

基于大数据技术的足球数据分析与可视化系统

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码 精品专栏&#xff1a;Java精选实战项目…

java计算机毕设课设—博网即时通讯软件(附源码、文章、相关截图、部署视频)

这是什么系统&#xff1f; 资源获取方式在最下方 java计算机毕设课设—博网即时通讯软件(附源码、文章、相关截图、部署视频) 博网即时通讯软件是一款功能丰富的实时通讯平台&#xff0c;旨在提升用户的交流效率与体验。在服务器端&#xff0c;该软件支持运行监控功能&#…

Java中的Junit、类加载时机与机制、反射、注解及枚举

目录 Java中的Junit、类加载时机与机制、反射、注解及枚举 Junit Junit介绍与使用 Junit注意事项 Junit其他注解 类加载时机与机制 类加载时机 类加载器介绍 获取类加载器对象 双亲委派机制和缓存机制 反射 获取类对象 获取类对象的构造方法 使用反射获取的构造方法创建对象 获…

无环SLAM系统集成后端回环检测模块(loop):SC-A-LOAM以及FAST_LIO_SLAM

最近在研究SLAM目标检测相关知识&#xff0c;看到一篇论文&#xff0c;集成了SC-A-LOAM作为后端回环检测模块&#xff0c;在学习了论文相关内容后决定看一下代码知识&#xff0c;随后将其移植&#xff0c;学习过程中发现我找的论文已经集成了回环检测模块&#xff0c;但是我的另…

Postgresql源码(136)syscache/relcache 缓存及失效机制

相关 《Postgresql源码&#xff08;45&#xff09;SysCache内存结构与搜索流程分析》 0 总结速查 syscache&#xff1a;缓存系统表的行。通用数据结构&#xff0c;可以缓存一切数据&#xff08;hash dlist&#xff09;。可以分别缓存单行和多行查询。 syscache使用CatCache数…

Hadoop框架及应用场景说明

Hadoop是一个开源的分布式系统基础架构。由多个组件组成&#xff0c;组件之间协同工作&#xff0c;进行大规模数据集的存储和处理。 本文将探讨Hadoop的架构以及应用场景。 一Hadoop框架 Hadoop的核心组件包含&#xff1a; 1. Hadoop分布式文件系统&#xff08;HDFS&#xff…

windows10使用bat脚本安装前后端环境之msyql5.7安装配置并重置用户密码

首先需要搞清楚msyql在本地是怎么安装配置、然后在根据如下步骤编写bat脚本&#xff1a; 思路 1.下载mysql5.7 zip格式安装包 2.新增data文件夹与my.ini配置文件 3.初始化数据库 4.安装mysql windows服务 5.启动并修改root密码&#xff08;新增用户初始化授予权限&#xff09…

浅拷贝深拷贝

&#x1f4cb;目录 &#x1f4da;引入&#x1f4da;浅拷贝&#x1f4d6;定义&#x1f4d6;实现方式&#x1f4d6;特点 &#x1f4da;深拷贝&#x1f4d6; 定义&#x1f4d6;实现方式&#x1f4d6;特点 &#x1f4da;拓展&#x1f4d6;Object类✈️toString()方法✈️equals()方…