波奇学Linux:信号的发送和保存

信号的发送的对象是pcb

task_struct{
int signal; //0000 0000 .... 0001

进程pcb中存在int型的signal来保存信号,用位图的方式,比特位的0,1表示是否收到信号

比特位位置表示信号的编号。

 发信号的本质就是修改task_struct的信号位图对应的比特位。

信号的作用是为了给用户层传递信息

信号的保存的原因:进程收到信号不会立即处理这个信号,要有个时间窗口

实时信号:立即处理,不能丢失

信号的保存

信号递达,信号未决,信号阻塞

信号递达(delivery):实际执行信号的处理的动作,即执行。

信号未决(pedding):信号从产生到递达之间的状态,就是把修改对应比特位,即信号传到进程。

进程可以选择阻塞(Block)某个信号,被阻塞的信号将处于pending状态,解除阻塞才进入递达状态。

忽略是递达后的状态和block不一样,忽略和自定义,默认是递达后三种处理方法

用户提供的方法可以覆盖handler数组的自定义方法

信号集类型sigset_t:封装好的位图

sigemptyset():初始化,并类图所有项都为0

sigaddset(sigset_t*set, int signum) 将位图的第signum位设为1

函数sigprocmask读取或者更改进程的信号屏蔽字。

修改当前进程的block位图

how的选项是

SIG_BLOCK:取位图交集

SIG_UNBLOCK:最后的set的block是参数set和old set共有的

SIG_SETMASK :覆盖

set:是新的位图

oldset是系统的位图

接口实操代码

#include<iostream>
#include<signal.h>
#include<unistd.h>using namespace std;void PrintPending(sigset_t &pending)
{for(int signo=1;signo<=31;signo++){if(sigismember(&pending,signo)){cout<<"1";}else{cout<<"0";}}cout<<endl;}
void handler(int signo)
{cout<<"catch a signo: "<<signo<<endl;
}int main()
{signal(2,handler);//对栈上的位图进行操作sigset_t bset,oset; //封装好的类图sigemptyset(&bset); //初始化类图sigaddset(&bset,2); //修改本地的类图//对阻塞的位图进行操作sigprocmask(SIG_SETMASK,&bset,&oset);sigset_t pending;int cnt=0;while(true){int n=sigpending(&pending); //获取pending类图if(n<0)continue;PrintPending(pending);sleep(1);cnt++;if(cnt==20){cout<<"unblock 2 signo"<<endl;sigprocmask(SIG_SETMASK,&oset,nullptr);}}// 打印pending// 发送2号信号 000...010return 0;
} 

利用mask可以把所有信号进程屏蔽,信号不就不会被处理。

信号捕捉处理

当我们的进程从内核态回到用户态进行信号的检测和处理

当系统调用时,操作系统会做身份切换的,用户身份变成内核身份,或者反着来

int 80 从用户态变成内核态

内核态:允许访问自己的系统代码和数据。

系统调用就是在1GB的地址空间进行执行的

操作系统视角:任何一个时刻,都会有进程执行,执行操作系统的代码就可以随时执行

操作系统的本质:基于时间中断的死循环,有一个时钟芯片,发送时间中断,驱动操作系统进行调度。

ecs寄存器有两个标志比特位 00 表示内核态,用户态是11,当切换到内核态时,才能访问内核代码。int 80陷入80

do_signal()检测信号

进入到用户态执行方法,如果是系统方法,再进行系统态。

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

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

相关文章

“词苑千载,群芳竞秀,盛开一枝女儿花”说的是哪位历史人物?2024年3月8日蚂蚁庄园今日答案:李清照

蚂蚁庄园是一款爱心公益游戏&#xff0c;用户可以通过喂养小鸡&#xff0c;产生鸡蛋&#xff0c;并通过捐赠鸡蛋参与公益项目。用户每日完成答题就可以领取鸡饲料&#xff0c;使用鸡饲料喂鸡之后&#xff0c;会可以获得鸡蛋&#xff0c;可以通过鸡蛋来进行爱心捐赠。其中&#…

计算机大数据毕业设计-基于Flask的旅游推荐可视化系统的设计与实现

基于Flask的旅游推荐可视化系统的设计与实现 编程语言&#xff1a;Python3.10 涉及技术&#xff1a;FlaskMySQL8.0Echarts 开发工具&#xff1a;PyCharm 摘要&#xff1a;以Pycharm为旅游推荐系统开发工具&#xff0c;采用B/S结构&#xff0c;使用Python语言开发旅游景点推…

springcloud:3.6测试信号量隔离

服务提供者【test-provider8001】 Openfeign远程调用服务提供者搭建 文章地址http://t.csdnimg.cn/06iz8 相关接口 测试远程调用&#xff1a;http://localhost:8001/payment/index 服务消费者【test-consumer-resilience4j8004】 Openfeign远程调用消费者搭建 文章地址http://t…

26.基于springboot + vue实现的前后端分离-就业管理系统

项目介绍 系统分为管理员、企业、求职者三个角色 管理员&#xff1a; 登录、个人中心、学生信息管理、企业信息管理、岗位分类管理、学历信息管理、友情链接管理、新闻资讯管理、收藏管理、招聘信息管理、应聘信息管理、求职者信息管理 企业&#xff1a; 注册、登录、个人…

科研笔记:TKDE 投稿指南

1 混合出版物 允许传统稿件提交或作者支付的开放获取&#xff08;OA&#xff09;稿件 2 长度 所有页面限制包括参考文献和作者简历。对于常规论文&#xff0c;接受稿件的最终版面设计完成后超出这些限制的页面&#xff0c;将收取强制性超长页面费用&#xff08;MOPC&#xf…

从 HPC 到 AI:探索文件系统的发展及性能评估

随着 AI 技术的迅速发展&#xff0c;模型规模和复杂度以及待处理数据量都在急剧上升&#xff0c;这些趋势使得高性能计算&#xff08;HPC&#xff09;变得越来越必要。HPC 通过集成强大的计算资源&#xff0c;比如 GPU 和 CPU 集群&#xff0c;提供了处理和分析大规模数据所需的…

【开源物联网平台】FastBee使用EMQX5.0接入步骤

​&#x1f308; 个人主页&#xff1a;帐篷Li &#x1f525; 系列专栏&#xff1a;FastBee物联网开源项目 &#x1f4aa;&#x1f3fb; 专注于简单&#xff0c;易用&#xff0c;可拓展&#xff0c;低成本商业化的AIOT物联网解决方案 目录 一、将java内置mqtt broker切换成EMQX5…

你未必知道的CSS阴影

你未必知道的CSS阴影 假设我们有这样的需求&#xff0c;给图片或元素周围设置阴影效果那么大家一定会联想到 box-shadow 属性&#xff0c;但其实 实现的效果是不对的 可以看到左边是需求效果&#xff0c;而右边使用了 box-shadow 后&#xff0c;效果并不是我们想要的那样 解…

03.axios数据提交和错误处理

一.axios常用请求方法和数据提交 1. 想要提交数据&#xff0c;先来了解什么是请求方法 请求方法是一些固定单词的英文&#xff0c;例如&#xff1a;GET&#xff0c;POST&#xff0c;PUT&#xff0c;DELETE&#xff0c;PATCH&#xff08;这些都是http协议规定的&#xff09;&am…

基于Python实现银行卡识别

在本文中将介绍如何使用Python和深度学习技术来实现银行卡识别功能。银行卡识别是一个在金融、安全等领域具有重要应用的问题&#xff0c;将使用深度学习模型来实现银行卡图像的识别和分类。 目录 引言数据集准备预处理和特征提取模型选择与训练模型评估与性能优化部署与应用 引…

pytest-allure报告生成

pytest生成allure报告步骤&#xff1a; 下载allure&#xff0c;配置allure报告的环境变量&#xff1a;把allure-2.13.7\bin 配置到环境变量path路径 验证&#xff1a;在dos窗口和pycharm窗口分别验证&#xff1a;allure –version 2. 生成临时的json报告 在pytest.ini配置文…

Docker 入门指南:基础概念、安装步骤及常用命令

一、Docker 简介 Docker 是一个开源的应用容器引擎&#xff0c;它允许开发者打包他们的应用以及应用的运行环境到一个可移植的容器中。容器是完全隔离的环境&#xff0c;它们可以在任何支持Docker的机器上运行&#xff0c;确保了应用的一致性和安全性。 二、Docker 核心概念 …

Wireshark——捕获localhost(127.0.0.1)对应端口的数据包

前提&#xff1a;安装的Wireshark要有Npcap。 步骤 打开Wireshark&#xff0c;选择Adapter for loopback traffic capture&#xff0c;在过滤器中填写需要监听的端口&#xff0c;再双击Adapter for loopback traffic capture。 点击左上角&#xff0c;开始捕获。

pyqt QTextEdit 捕获enter按键

参考&#xff1a; https://blog.csdn.net/qq_27061049/article/details/101550616 方法一&#xff1a; 在PyQt中&#xff0c;可以通过重写QTextEdit的keyPressEvent()函数来捕获Enter按键。下面是示例代码&#xff1a; from PyQt5.QtWidgets import QApplication, QMainWindo…

数据结构 --- 队列

队列概念 队列同栈一样&#xff0c;是一种特殊的数据结构&#xff0c;只允许在一端进行插入操作&#xff0c;在另一端进行删除操作&#xff0c;队列遵循先进先出原则。 进行插入操作的一端称为队尾&#xff0c;插入元素叫做入队 进行删除操作的一端称为队头&#xff0c;删除…

STM32学习7 按键扫描

STM32学习7 按键扫描 一、实验电路介绍二、按键GPIO初始化三、扫描原理1. GPIO引脚配置2. 状态轮询3. 按键状态检测4. 循环扫描的优缺点优点&#xff1a;缺点&#xff1a; 四、一次扫描与持续扫描五、代码实现1. 头文件定义2. 函数实现3. 主体函数 一、实验电路介绍 本实验使用…

Linux 之三:CentOS7 目录结构 和 日期及时区设置

Linux 目录 以下是对这些目录的解释&#xff1a; /bin&#xff1a;bin是Binary的缩写, 这个目录存放着最经常使用的命令。/boot&#xff1a; 这里存放的是启动Linux时使用的一些核心文件&#xff0c;包括一些连接文件以及镜像文件。/dev &#xff1a; dev是Device(设备)的缩写…

docker安装和使用kafka

1. 启动zookeeper Kafka依赖zookeeper, 首先安装zookeeper -p&#xff1a;设置映射端口&#xff08;默认2181&#xff09; docker run --name zookeeper \--network app-tier \-e ALLOW_ANONYMOUS_LOGINyes \--restartalways \-d bitnami/zookeeper:latest2. 启动kafka docker…

STM32各外设初始化步骤

1、GPIO初始化步骤 1、使能GPIO时钟 2、初始化GPIO的输入/输出模式 3、设置GPIO的输出值或获取GPIO的输入值 GPIO_InitTypeDef GPIO_InitStruct;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);GPIO_InitStruct.GPIO_Mode GPIO_Mode_Out_PP; GPIO_InitStruct.GPIO_Pin…

青少年如何从零开始学习Python编程?有它就够了!

文章目录 写在前面青少年为什么要学习编程 推荐图书图书特色内容简介 推荐理由粉丝福利写在最后 写在前面 本期博主给大家带来一本非常适合青少年学习编程的图书&#xff0c;快来看看吧~ 青少年为什么要学习编程 青少年学习编程&#xff0c;就好比在他们年轻时就开始掌握一种…