信号原理解析

news2024/11/23 15:08:21

目录

一、什么是信号

举例子:

进程如何认识信号

信号与进程的异步

进程如何储存信号

二、一个实例

signal函数:

三、实例后的思考

一个进程接受到信号后,处理信号的方法:

myhandler什么时候才会被调用

四、理解ctrl+c被解释成信号的过程


一、什么是信号

举例子:

举一些例子来理解:红绿灯、下课铃、倒计时、狼烟冲锋号、肚子叫、妈妈的脸色、语气、外卖电话……这些都是我们时候中常见的信号。

而且一般来说,我们看到信号就知道我们接下来应该要做什么了比如:红灯停、下课回家、饿了吃饭、外卖到了去拿等等等。

进程如何认识信号

一个进程在运行的时候也会接受到很多的信号,就像上面这些行为一样,收到了一个信号就会去执行一些默认的操作—————这写行为都是程序猿在编写os时就设置的默认操作,这也就是为什么进程会认识这些信号。就比如我像一个进程发送了一个终止信号,他就回去执行终止操作。

信号与进程的异步

给出一个场景,加深一下理解:你在家里玩游戏,你点了一个外卖。玩着玩着你接到了一个外卖电话,让你下去拿外卖,但是你在玩游戏,你说先放在那里,我等一下去拿。

对于进程来说这也是同理的,如果进程在执行一个优先级更高的任务的时候,接收到了信号是不会第一时间去处理的。

因此我们得出一个结论:信号的产生对于进程来说是异步的。

如果信号产生了,我们不第一时间处理的话,这就说明了,进程必须要有储存信号的能力

进程信号时间线:

 

进程如何储存信号

进程是如何记录对应的产生的信号的呢?储存在哪里?

先看一下常用的对进程信号吧:

观察一下 ,一共有多少个信号呢?许多同学会脱口而出64个,其实不然,31到34之间被分开了。因此这62个信号被分成了两个部分:1~31,34~64。

后面那部分我们不做讨论,那个是实时信号(接受到信号就马上要执行操作),我们的操作系统用不到。

我们会发现,1~31一共31个信号,非常巧合的只比int的比特位少了一个,int有四个字节,一个字节有八个比特位。聪明的同学已经猜到了存放信号的结构————位图。一个int整数每个比特位对应一个信号,0表示没有,1表示有这个信号。

这里也遵循了先描述在组织的原则,int组织。

那么这个int放在哪里的呢————task_struct结构体中。

其实通过上面的描述我们应该也感受出了,1~31号信号,我们只记录它是否产生。

所谓的发送信号,本质上是写入信号,谁写入——由操作系统写入,将0—>1。

二、一个实例

上面说了一大堆,如何证明我们的进程确实收到了信号呢?

先介绍一个函数,再通过一个代码实例:

signal函数:

原型:void (*signal(int signum, void (*handler)(int)))(int);

这里看不懂就跟着我简单了解一下就好了二,会用就行:

外面那一层void *其实就是声明了一个参数为int的函数指针。然后我们是可以直接调用这个函数指针的。然后里面那层看起来就非常正常了:

signal(int signum, void (*handler)(int))

这个函数有两个参数,一个就是信号,另外一个是我们自定义的一个函数的指针

所以这个功能是什么呢:

简单说就是设立一个规则,就是当我们的进程接收到了和第一个参数相等的信号时,就会调用后面我们写的函数指针。

 mykill.cc

#include<iostream>
#include<cstdlib>
#include<cstring>
#include<cerrno>
#include<cassert>
#include<string>
#include<unistd.h>
#include<sys/types.h>
#include<signal.h>


void myhandler(int signo)
{
    std::cout<<"get a signal:"<<signo<<std::endl;//打印获得的信号
}


int main()
{
    signal(SIGINT,myhandler);
    while(true)
    {
        std::cout<<"我是一个进程,我正在运行"<<getpid()<<std::endl;
        sleep(1);
    }

    return 0;
}

然后我那这个函数在linux终端下运行:

 

 使用Ctrl+c的原因:用户按下Ctrl-C ,这个键盘输入产生一个硬件中断,被OS获取,解释成信号,发送给目标前台进程。

简单的说,就是:相当于操作系统给我这个进程写入了一个信号,这个信号就是2——SIGINT信号。

我们发现一般可以直接退出进程的操作无法退出,并继续执行。

我是通过Ctrl+\退出的,这个会被解释成3——SIGQUIT信号。

如果我调皮一点:把这个信号也自定义一下操作呢?

int main()
{
    signal(2,myhandler);
    signal(SIGQUIT,myhandler);//加一个

    while(true)
    {
        std::cout<<"我是一个进程,我正在运行"<<getpid()<<std::endl;
        sleep(1);
    }

    return 0;
}

我们会发现,ctrl+\也不行了。 

我是通过命令行发送信号结束进程的:

 直接将9信号写入18769进程。

三、实例后的思考

一个进程接受到信号后,处理信号的方法:

1、默认动作——就像ctrl+c就是默认退出前台进程。

2、忽略信号——进程可以选择忽略某些信号,这通常是由于进程对该信号无强制要求或者不能有效地处理该信号。使用 signal() 函数可以指定一个信号的处理方式为忽略。

3、用户自定义信号(捕捉信号)——就是用上面的signal函数实现的操作。

这上面三个是我们可以在上面的例子中发现的,还有另外两种情况:

4、阻塞信号:进程可以选择阻塞某些信号的传递,这样当该信号被发送给进程时,操作系统会将其挂起,直到进程取消该信号的阻塞。使用 sigprocmask() 函数可以设置信号掩码来实现信号的阻塞。

5、信号传递:进程可以使用 kill() 函数向其他进程或进程组发送信号,以实现进程间通信或通知其他进程。

myhandler什么时候才会被调用

是在调用singal函数的时候吗?

不是,它只是定下了这个规矩,接收到这个信号的时候才会调用这个函数。

四、理解ctrl+c被解释成信号的过程

这是一个键盘: 

这是一个cpu,上面有很多个引脚 :

 这些引脚连接不同的硬件,其中就好引脚连接了我们的键盘:

 当键盘被摁下,cpu内部就会储存一个中断号,这里是9。

 然后cpu就会从一个向量中断表(一个数组)里去寻找一个下标为9的元素:

 然后这个元素就会指向一个读取键盘的方法:

 这样就读取到了一个ctrl+c的数据,然后将2号信号写入对应的进程就可以了。

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

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

相关文章

【spring源码系列-04】注解方式启动spring时refresh的前置工作

Spring源码系列整体栏目 内容链接地址【一】spring源码整体概述https://blog.csdn.net/zhenghuishengq/article/details/130940885【二】通过refresh方法剖析IOC的整体流程https://blog.csdn.net/zhenghuishengq/article/details/131003428【三】xml配置文件启动spring时refres…

第五十回:TabBarView Widget

文章目录 概念介绍使用方法示例代码综合使用 我们在上一章回中介绍了DefaultTabBarController Widget相关的内容,本章回中将介绍 TabBarView Widget.闲话休提&#xff0c;让我们一起Talk Flutter吧。 概念介绍 我们这里介绍的TabBarView类似前面章回中介绍过的PageView组件&a…

应对数据不平衡和过拟合的分类模型优化策略

不平衡分类 数据类别不平衡问题是指数据集中各类别样本数量不对等的情况。 基于抽样的方法 在处理这类问题时&#xff0c;可以采用基于抽样的方法来解决。以下是几种常见的基于抽样的方法&#xff1a; 两阶段学习 两阶段学习是一种解决不平衡分类问题的方法&#xff0c;包括…

软件测试 之Web项目实战解析(附全套实战项目教程+视频+源码)

软件测试之web项目实战 按顺序依次为&#xff1a;【搭建测试环境】、【需求评审】、【编写测试计划】、【分析测试点.编写测试用例】、【用例评审】、【执行用例提bug】、【测试报告】 一&#xff1a;搭建测试环境 (1) 搭建测试环境之 【常见项目结构模式】 &#xff08;2&am…

【大数据之路3】分布式协调系统 Zookeeper

3. 分布式协调系统 Zookeeper 1. Zookeeper 概述1. Zookeeper 介绍2. Zookeeper 结构/功能【重点】1. 文件系统 ZNode1. ZNode 特点2. ZNode 功能3. ZNode 介绍【非常重要】 2. 监听机制 3. 典型应用场景1. 命名服务2. 配置管理3. 集群管理4. 分布式锁5. 队列管理 2. 架构与原理…

MaskRCNN与注意力机制

Mask RCNN---two stage mask rcnn是一个分割算法(实例分割)&#xff0c;可用于&#xff1a; 目标检测 实例分割 关键点检测 本质上&#xff0c;mask R-CNN是在faster rcnn的基础上&#xff0c;加入了FCN模块&#xff0c;得到最终的分割结果。 先检测&#xff0c;再分割。不…

实战:在Docker上部署Springboot项目(附源码)

实战&#xff1a;在Docker上部署Springboot项目&#xff08;附源码&#xff09; 1、docker的基本使用 1、为什么使用docker 2、docker的介绍 3、docker安装 https://www.codezhou.top/article/docker%E4%BD%BF%E7%94%A8 2、dockers安装mysql 拉取 Mysql 5.7.31 镜像 dock…

手工测试没有前途,自动化测试会取代手工测试?

在测试行业&#xff0c;一个一直被讨论的问题就是&#xff1a;手工测试没有前途&#xff0c;自动化测试会取代手工测试&#xff1f; 首先说结论&#xff1a;自动化测试不会取代手工测试&#xff0c;这完全是两个维度的事情。为什么不会呢&#xff1f;我们需要从本源上说起。 什…

【数据挖掘实战】——舆情分析:对微博文本进行情绪分类

&#x1f935;‍♂️ 个人主页&#xff1a;Lingxw_w的个人主页 ✍&#x1f3fb;作者简介&#xff1a;计算机科学与技术研究生在读 &#x1f40b; 希望大家多多支持&#xff0c;我们一起进步&#xff01;&#x1f604; 如果文章对你有帮助的话&#xff0c; 欢迎评论 &#x1f4a…

Tomcat部署及多实例部署

Tomcat部署及多实例部署 一、什么是Tomcat二、Tomcat核心组件1.什么是servlet2.什么是 JSP 三、Tomcat 功能组件结构1.Connector2.Container2.1Container 包含四个子容器 3.Service 四、Tomcat 请求过程五、Tomcat 服务部署1.关闭防火墙2.上传jdk包&#xff0c;查看jdk版本&…

SpringCloud Gateway网关多路由配置访问404解决方案

文章目录 一、问题描述&#xff1a;SpringCloud GateWay Eureka访问出现404&#xff0c;Not Found二、解决方案:1、 配置 filters: - StripPrefix12、删除冲突依赖3、检查启动类4、检查配置文件 一、问题描述&#xff1a;SpringCloud GateWay Eureka访问出现404&#xff0c…

如何用新范式解决安全难题?数字安全免疫力研讨论坛给你答案!

6月13日&#xff0c;腾讯安全、腾讯研究院将联动IDC、《中国信息安全》杂志社、CIO 时代、新基建创新研究院等多家行业机构、媒体共同发起「数字安全免疫力」研讨论坛&#xff0c;汇聚产学研各界专家&#xff0c;研判安全态势、分享最佳实践&#xff0c;碰撞新一代的安全理念&a…

【Java基础学习打卡02】计算机硬件与软件

目录 引言一、硬件组成二、软件组成三、软硬件工作流程四、性能指标五、选购建议总结 引言 本小节将认识计算机硬件与软件&#xff0c;以及软硬件工作流程&#xff0c;还要知道计算机性能指标&#xff0c;并可以指导我们购买电脑。还是那句话&#xff0c;了解计算机工作流程对…

Qt6之样式表

Qt的样式表主要是受到CSS的启发&#xff0c;通过调用QWidget::setStyleSheet()或QApplication::setStyleSheet()&#xff0c;你可以为一个独立的子部件、整个窗口&#xff0c;甚至是整个应用程序指定一个样式表。样式表由影响窗口部件绘制的样式规则组成。这些规则都是普通文本…

stable-diffusion领域prompt集合

有什么写实的stable diffusion模型&#xff1f; - 知乎试了试这个模型&#xff0c;感觉勉强&#xff0c;大佬们知道有没有更写实的模型&#xff1f;https://huggingface.co/CompVis/stable-diff…https://www.zhihu.com/question/567026134Stable Diffusion好看的御姐风AI美女P…

数据仓库分析工具Hive

数据仓库分析工具Hive 概述Hive简介Hive与Hadoop生态系统中其他组件的关系Hive与传统数据库的对比 Hive系统架构概述Hive组成模块Hive工作原理SQL语句转换成MapReduce的基本原理Hive中SQL查询转换成MapReduce作业的过程 从外部访问Hive的典型方式 Hive的应用Hive在报表中心的应…

jmeter性能测试实战--web程序

目录 前言&#xff1a; 项目背景 测试步骤 前言&#xff1a; JMeter是开源的Java性能测试工具&#xff0c;广泛应用于Web、移动应用程序等领域的性能测试中。在Web应用程序中&#xff0c;JMeter能够模拟多用户并发请求&#xff0c;验证系统在高负载情况下的性能&#xff0c…

【王道考研】王道数据结构与算法详细笔记(全)

目录 第一章 数据结构绪论 1.1 数据结构的基本概念 1.2 数据结构的三要素 1.2.1. 数据的逻辑结构 1.2.2. 数据的存储结构&#xff08;物理结构&#xff09; 1.2.3. 数据的运算 1.2.4. 数据类型和抽线数据类型 1.3 算法的基本概念 1.4 算法的时间复杂度 1.5 算法的空…

再一次安装anygrasp

1&#xff0c;anaconda 2&#xff0c;新建py3.6.2的环境 因为anygrasp 要求 pytorch 1.6 太老了&#xff0c;而且对应的cuda 都是cuda 11以下的版本 我是笔记本带3060&#xff0c;只能cuda11以上。 为了解决这个问题&#xff0c;感谢史驭舒大佬提供的思路 他复现用的环境是…

代码随想录刷题第48天|LeetCode198打家劫舍、LeetCode213打家劫舍II、LeetCode337打家劫舍III

1、LeetCode198打家劫舍 题目链接&#xff1a;198、打家劫舍 1、dp[i]&#xff1a;考虑下标i&#xff08;包括i&#xff09;以内的房屋&#xff0c;最多可以偷窃的金额为dp[i]。 2、递推公式&#xff1a; 如果偷第i房间&#xff0c;那么dp[i] dp[i - 2] nums[i] &#xf…