LIUNX系统编程:信号(3)

news2024/11/18 3:37:13

目录

3.信号的处理

3.1信号是什么时候被处理的

read系统调用

3.2信号是怎样被处理的

内核态和用户态

 3.3操作系统是如何运行处理信号的呢?

中断技术

什么让操作系统运行起来的

3.4捕捉信号的其他方式

​编辑

demo代码


3.信号的处理

3.1信号是什么时候被处理的

信号在发送给进程之后不是立即处理的,而是等到合适的机会,在去处理信号的。

什么是合适的机会呢?

进程从内核态要切换回用户态时,会检测处理信号。

为什要内核态才能处理信号呢?

因为处理信号的时候一定会对内核数据结构做修改,就像在处理信号之前,要把pending表中信号对应的bit位置为0,然后去调用handler函数,处于用户态的时候是不允许让问内核数据的。

这里可能会有个问题,直接使用系统调用不就能对内核数据进行修改吗?还用上面说的来回切换多麻烦啊?

这是因为在执行系统调用的时候,也会切换到内核态的,举个例子。

read系统调用

1.将参数拷贝到内核

2.切换为内核态

3.在task_struct中找到文件描述符表。

4.访问0号fd的文件,将该文件的缓冲区拷贝到buffer中

5.将结果返回给用户。

6.返回用户态

信号的大致处理流程就是这样的。

但是自定义和默认处理方式流程是有区别的。

自定义处理:执行sighandler需要切换回用户态,去执行自定义的函数,然后返回内核态,内核态在返回运行结果给用户态。

默认处理:直接在内核态执行默认的sighandler函数,然后返回用户态即可。

 

3.2信号是怎样被处理的

内核态和用户态

进程的虚拟地址空间,分为用户区0-3g,和内核区3-4g,一共是4g。

这也就是为什么,进程总能找到操作系统,让操作系统替进程执行一些动作。

操作系统被映射到了,进程的地址空间内,经过mmu+页表将虚拟的地址转化为物理地址,就找到操作系统了。

内核级的页表只有一份,因为操作系统只有一个,操作系统的内核数据也只有一份,只需要一个内核级的页表,建立不同进程的虚拟地址到操作系统所处物理内存的映射,就可以让多个进程看到一个操作系统。

但是进程是有多个的,每个进程的数据也是不同的,这就需要不同的页表,来映射不同的进程。

 3.3操作系统是如何运行处理信号的呢?

首先呢操作系统是一个功能强大的傀儡,它没有自己的思想,得有人告诉操作系统要做什,它才会去做,不然操作系统什么都不会做。

中断技术

信号技术本质就是软件中断,软件中断就是对硬件中断的模拟。

 硬件中断:键盘直接连接到cpu的针脚上,当键盘输入的时候,会给对应的针脚一个高电频,cpu会拿着这个针脚的编号,去操作系统的中断向量表(函数指针数组),执行对应的函数。

软件中断:由软件产生一个中断信号,然后去操作系统的终端向量表,执行对应的函数。

重谈read方法

cs的寄存器的后两位是权限标识位。00代表是内核态,11代表用户态。

首先判断当前是不是用户态,是就把系统调用表中对应系统调用的编号放入eax寄存器中。

执行int 0x80指令陷入内核态,执行系统调用。

什么让操作系统运行起来的

操作系统是一个死循环,不断的接受其他外部的中断。

由一个硬件,向操作系统发送一个频率非常高,时间非常短的周期时钟中断,操作系统会拿着中断号去操作系统的中断向量表中,执行进程调度,内存管理,更新系统时间。。。任务。

3.4捕捉信号的其他方式

在处理信号的时候,会讲处理的信号屏蔽,防止一直接受同一个信号陷入循环。

参数:

signum是想要捕捉的信号,或者一些选项(不介绍)。

act:act是个结构体,含有一下内容。

        sa_handler是想要自定处理的函数

        sa_sigaction处理实时信号

        sa_mask除了屏蔽当前信号,还要屏蔽哪些信号。

        sa_flag是一些选项。

oldact:输出型参数,将原来信号的处理保存到oldact中。

demo代码

使用一下这个接口,屏蔽2号信号的同时屏蔽3,4,5号信号。

看下现象,运行起来的pending位图2,3,4,5的位置应该都是1。

验证

#include<signal.h>
#include<iostream>
#include<unistd.h>

void print(sigset_t &pending)
{
    for(int i = 31; i >= 1; i--)
    {
        if(sigismember(&pending,i))
        {
            std::cout<<"1";
        }
        else
        {
            std::cout<<"0";
        } 
    }
    std::cout<<std::endl;
}


void handler(int signo)
{
    //获取pending并打印
    sigset_t pending;
    sigemptyset(&pending);
    while(true)
    {
        sigpending(&pending);//获取pending位图
        print(pending);//打印pending
        sleep(1);
    }

}


int main()
{
    struct sigaction act,oact;
    act.sa_handler = handler;
    act.sa_flags = 0;
    sigemptyset(&act.sa_mask);//初始化信号集
    sigaddset(&act.sa_mask,3);//在信号集中添加3号信号
    sigaddset(&act.sa_mask,4);
    sigaddset(&act.sa_mask,5);

    sigaction(2,&act,&oact);//捕捉信号
    while(true)
    sleep(1);
    return 0;
}

第一次kill-2让信号被捕捉,第二次就直接被阻塞在pending位图中。

kill -3 -4 -5每次pending位图对应的位置都会变为1.

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

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

相关文章

[自学记录09*]Unity Shader:在Unity里渲染一个黑洞

一、前言 记得很久很久以前&#xff0c;在ShaderToy上看过一个黑洞的效果&#xff0c;当时感觉太*8帅了&#xff0c;于是这几天就尝试自己弄了一个。 Gargantua With HDR Bloom (shadertoy.com) 下面是我自己实现的黑洞 可以看到还是略逊一筹&#xff08;感觉略逊百筹&#x…

【Unity游戏制作】地精寻宝Gnome‘s Well That Ends Well卷轴动作游戏【一】场景搭建

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;元宇宙-秩沅 &#x1f468;‍&#x1f4bb; hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍&#x1f4bb; 本文由 秩沅 原创 &#x1f468;‍&#x1f4bb; 专栏交流&#x1f9e7;&…

基于51单片机的多功能计算器全套设计

通过本次课题设计,应用《单片机应用基础》、《数据结构》等所学相关知识及查阅资料,完成实用计算器的设计,以达到理论与实践更好的结合、进一步提高综合运用所学知识和设计的能力的目的。 通过本次设计的训练,可以使我在基本思路和基本方法上对基于MCS-51单片机的嵌入式系…

小学一年级数学上册,我终于学完了

目录 一、背景二、过程1.我对课程中的一些知识的思考2.我对于产品的思考3.我对自己儿子与知识产品结合的思考4.产品反馈的那些有意思的数据 三、总结 一、背景 简约而不简单&#xff0c;即是曾经的再现&#xff0c;也是未来的延伸&#xff0c;未来已来&#xff0c;就在脚下。 …

git(其六)--总结

配置基础信息 //1.配置用户名和邮箱 git config --global user.name "带着引号写一个昵称" git config --global user.email "带着引号写一个邮箱"//2.建立一个git本地库 git init//3.查看本地内容 git status //可以看到那些处于待加入本地库的文件&a…

使用 tc (Traffic Control)控制网络延时

设置网络延时 1500ms 800ms tc qdisc add dev eth0 root netem delay 1500ms 800msping 测试 ping www.baidu.com取消设置网络延时 sudo tc qdisc del dev eth0 root

什么情况下要配置DNS服务

什么是DNS 一、DNS就是域名解析 我们上网的方式通常都由ip地址组成&#xff0c;但是为了有个规范&#xff0c;而且我们也不可能去记住那么多一串Ip数字&#xff0c;首先域名就会比ip好记很多&#xff0c;其次固定性&#xff0c;一旦服务器换了&#xff0c;只要重新绑定域名对…

ic基础|复位篇02:芯片中的“人生重来枪”!crg之复位系统

大家好&#xff0c;我是数字小熊饼干&#xff0c;一个练习时长两年半的ic打工人。我在两年前通过自学跨行社招加入了IC行业。现在我打算将这两年的工作经验和当初面试时最常问的一些问题进行总结&#xff0c;并通过汇总成文章的形式进行输出&#xff0c;相信无论你是在职的还是…

从云端到终端:青犀视频汇聚/融合平台的视频接入方式与场景应用

一、青犀视频汇聚/融合平台 由TSINGSEE青犀视频研发的EasyCVR智能融合/视频汇聚平台基于“云-边-端”一体化架构&#xff0c;支持视频汇聚、融合管理&#xff0c;兼容多协议&#xff08;GA/T1400/GB28181/Onvif/RTSP/RTMP/海康SDK/Ehome/大华SDK/宇视SDK等&#xff09;、多类型…

代码随想录算法训练营第31天(py)| 贪心 | 455.分发饼干、376. 摆动序列、53. 最大子序和

455.分发饼干 力扣链接 假设你是一位很棒的家长&#xff0c;想要给你的孩子们一些小饼干。但是&#xff0c;每个孩子最多只能给一块饼干。 对每个孩子 i&#xff0c;都有一个胃口值 g[i]&#xff0c;这是能让孩子们满足胃口的饼干的最小尺寸&#xff1b;并且每块饼干 j&#…

谨以此文章记录我的蓝桥杯备赛过程

以国优秀结束了蓝桥杯cb组 鄙人来自电信学院&#xff0c;非科班出身&#xff0c;在寒假&#xff0c;大约2024年2月份&#xff0c;跟着黑马程序员将c基础语法学完了&#xff0c;因为过年&#xff0c;事情较多&#xff0c;没在学了。 最初就是抱着拿省三的态度去打这个比赛的&a…

C++:栈(stack)、队列(queue)、优先级队列(priority_queue)

hello&#xff0c;各位小伙伴&#xff0c;本篇文章跟大家一起学习《C&#xff1a;栈&#xff08;stack&#xff09;和队列&#xff08;queue&#xff09;》&#xff0c;感谢大家对我上一篇的支持&#xff0c;如有什么问题&#xff0c;还请多多指教 &#xff01; 文章目录 :map…

Spring Cloud系列——使用Sentinel进行微服务保护

文章目录 一、引言1. 雪崩问题的产生原因2. 解决雪崩问题的思路 二、微服务保护1. 服务保护方案1.1 请求限流1.2 线程隔离1.3 服务熔断 2. Sentinel2.1 安装2.2 微服务整合2.2.1 请求限流2.2.2 线程隔离①OpenFeign整合Sentinel②配置线程隔离 2.2.3 服务熔断①编写降级逻辑②配…

队列的讲解与实现

这里写目录标题 一、队列的概念及结构二、队列的实现(使用VS2022的C语言)1.初始化、销毁2.入队、出队3.返回队头元素、返回队尾元素、判空、返回有效元素个数 三、完整 Queue.c 源代码 一、队列的概念及结构 队列&#xff1a;只允许在一端进行插入数据操作&#xff0c;在另一端…

网络空间安全数学基础·同余式

6.1 剩余系&#xff08;掌握&#xff09; 6.2 同余式概念与一次同余式&#xff08;熟练&#xff09; 6.3 中国剩余定理&#xff08;熟练&#xff09; 6.1 剩余系 设m是正整数&#xff0c;模m同余的全体整数是一个模m剩余类&#xff0c;即可表示为a qmr&#xff0c; 0≤r<…

在推荐四款软件卸载工具,让流氓软件无处遁形

Revo Uninstaller Revo Uninstaller是一款电脑软件、浏览器插件卸载软件&#xff0c;目前已经有了17年的历史了。可以扫描所有window用户卸载软件后的残留物&#xff0c;并及时清理&#xff0c;避免占用电脑空间。 Revo Uninstaller可以通过命令行卸载软件&#xff0c;可以快速…

python数据分析-问卷数据分析(地理课)

学生问卷 分析学生背景&#xff1a;班级分布、每周地理课数量、地理成绩分布 根据问卷&#xff0c;可以知道&#xff1a; 班级分布&#xff1a; 七年级有118名学生。 八年级有107名学生。 每周地理课的数量&#xff1a; 有28名学生每周有1节地理课。 有99名学生每周有2…

dots_image 增强图像中的圆点特征

dots_image 增强图像中的圆点特征 1. dot_image 有什么用途&#xff1f;2. 点状字符的特征增强3. Halcon代码 1. dot_image 有什么用途&#xff1f; Enhance circular dots in an image. 这个算子可以增强图像中的圆点特征&#xff0c;例如下面的例子。 2. 点状字符的特征增强…

有待挖掘的金矿:大模型的幻觉之境

人工智能正在迅速变得无处不在&#xff0c;在科学和学术研究中&#xff0c;自回归的大型语言模型&#xff08;LLM&#xff09;走在了前列。自从LLM的概念被整合到自然语言处理&#xff08;NLP&#xff09;的讨论中以来&#xff0c;LLM中的幻觉现象一直被广泛视为一个显著的社会…

CAD二次开发(8)-探索实现不重启CAD进行热部署代码

最近在研究CAD二次开发过程中&#xff0c;调试代码的过程中&#xff0c;需要频繁地重启CAD&#xff0c;非常浪费我们的开发时间&#xff0c;所以我就一直在想&#xff0c;怎么可以实现在不每次重启代码和CAD的情况下&#xff0c;实现代码的热部署效果。 我找到的方式&#xff…