Linux:信号的保存[2]


1.信号在内核中的表示


因为是三种内核的数据结构,操作系统就可以通过操作这些数据结构提供接口。
如果一个信号没有产生,并不妨碍它可以先被阻塞。
当同一时刻发送大量相同信号时,会丢失。

2.信号的捕捉(重点)

信号产生的时候,不会被立即处理,而是在合适的时候,暂存在pending位图,内核态返回用户态的时候,进行处理。
补充:平时我们所写的代码在编译运行之后全部是运行在用户态的,避免不了访问<操作系统自身的资源[getpid\waitpid...]<硬件资源[printf\write\read];为了访问这些资源,必须通过系统调用。普通用户无法在用户态来执行系统调用,必须让自己的身份变成内核态。实际执行操作系统的"人"是你这个进程,身份其实是内核,往往系统调用比较费时间,尽量避免频繁调用系统调用,STL中的空间配置器会额外申请空间避免频繁向系统申请。
寄存器可以被划分为两类:<可见寄存器(eabcx,pc指针,程序计数器,ebp(栈顶),exp(栈底)) <不可见寄存器(状态寄存器-是否溢出)。凡是和当前进程强相关的,保存这个进程的相关数据(上下文数据)。有一些寄存器corrector当前正在运行进程的PCB(task_struct),CPU中也有一些寄存器指向页表的起始地址,集成MMU内存单元也能完成虚拟地址向物理内存的转化,CR3寄存器:表征当前进程的状态(为0:内核态,为3:用户态)。查看CPU中CR3寄存器就可以知道当前进程是内核态还是用户态。
进程怎么调用操作系统?
为了进程的独立性每个进程都有自己的代码和数据被放到了物理内存的不同区域;CPU中有一个寄存器指向内核级页表;当开机时,将操作系统加载进物理内存;每一个进程都有自己的地址空间(用户空间独占),内核空间(被映射到了每一个进程的3~4G空间中),进程要访问OS的接口,其实只需要在自己的地址上进行跳转就可以了。无论进程如何切换,3~4G的内核空间都是不变的。
用户凭什么能够执行访问内核的接口或者数据呢?必须更改当前进程的运行级别,系统调用接口起始的位置会把你的用户权限从3号状态改为0号状态,所以系统调用接口前半部分其实是以用户态运行的(int 80陷入内核-更改寄存器状态转换/跳转 页表切换)。总的来说进程如何调用系统调用?其实就是在每个进程的虚拟地址空间中存在3~4G的内核空间,当进行系统调用时就会跳转到内核空间,状态由用户态切成内核态执行系统调用。
系统调用、进程切换、异常都会触发用户态内核态切换。
如果并没有发生系统调用或者进程切换...这些与处理信号没什么相关性,发生内核陷入,状态转化。完成相关调用时,不会立即切回用户态,会去处理PCB中信号(block\pending\handler),在状态寄存器中由0置3

信号捕捉过程涉及的函数: 

sigset_t 信号集,位图结构,分为两种,block信号集(信号屏蔽字)、pending信号集,表示每个信号的状态,软件比特位为0/1、在硬件的表示就是高低电频、
sigprocmask,更改进程的pending表

#include <signal.h>
int sigprocmask(int how, const sigset_t *set, sigset_t *oset); 
返回值:若成功则为0,若出错则为-1 
//how有以下三种:追加/解除/重置
//set与how强相关,输入型参数,oset输出型参数

 sigpending,如果哪个进程调用sigpending,我们就获取哪一个进程的pending位图

#include <signal.h>
sigpending()
读取当前进程的未决信号集,通过set参数传出。调用成功则返回0,出错则返回-1。 下面用刚学的几个函数做个实验。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

顺序表和链表(详解)

线性表 线性表&#xff08; linear list&#xff09;是n个具有相同特性的数据元素的有限序列。 线性表是一种在实际中广泛使用的数据结构&#xff0c;常见的线性表&#xff1a;顺序表、链表、栈、队列、字符串... 线性表在逻辑上是线性结构&#xff0c;也就说是连续的一条直线。…

【电脑无法通过鼠标和键盘唤醒应该怎么办】

【电脑无法通过鼠标和键盘唤醒应该怎么办】 方法一(有时候不起作用):方法二(方法一无效时,使用方法二): 方法一(有时候不起作用): 方法二(方法一无效时,使用方法二):

动态规划(路径问题)

62. 不同路径 62. 不同路径 - 力扣&#xff08;LeetCode&#xff09; 动态规划思想第一步&#xff1a;描述状态~ dp[i][j]&#xff1a;表示走到i&#xff0c;j位置时&#xff0c;一共有多少种方法~ 动态规划思想第二步&#xff1a;状态转移方程~ 动态规划思想第三步&#xf…

vue + element-ui 组件样式缺失导致没有效果

失效 代码&#xff1a; 修改方法&#xff1a; 在main.js文件里面加上&#xff1a; import element-ui/lib/theme-chalk/index.css; 最后&#xff1a;

Go 切片:用法和本质

要想更好的了解一个知识点&#xff0c;实战是最好的经历。 题目 我这里放一道题目&#xff1a; package mainimport "fmt"func SliceRise(s []int) {s append(s, 0)for i : range s {s[i]}fmt.Println(s) }func SlicePrint() {s1 : []int{1, 2}s2 : s1s2 append…

Spring MVC:设置响应

目录 引言 1. 返回静态页面 1.1 Spring 默认扫描路径 1.2 RestController 1.2.1 Controller > 返回页面 1.2.2 ResponseBody 2. 返回 HTML 2.1 RequestMapping 2.1.1 produces(修改响应的 Content-Type) 2.1.2 其他属性 3. 返回 JSON 4. 设置状态码 4.1 HttpSer…

基于Spark的共享单车数据存储系统的设计与实现_springboot+vue

开发语言&#xff1a;Java框架&#xff1a;springbootJDK版本&#xff1a;JDK1.8服务器&#xff1a;tomcat7数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09;数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/ideaMaven包&#xff1a;…

在Unity中使用大模型进行离线语音识别

文章目录 1、Vosk下载下载vosk-untiy-asr下载模型在项目中使用语音转文字音频转文字2、whisper下载下载unity项目下载模型在unity中使用1、Vosk 下载 下载vosk-untiy-asr Github链接:https://github.com/alphacep/vosk-unity-asr 进不去Github的可以用网盘 夸克网盘链接:h…

【计算机网络】- 应用层HTTP协议

目录 初识HTTP 什么是HTTP 版本 HTTPS 模型 HTTP抓包工具 为什么使用 抓包工具的下载 下载后的重要操作 Fiddler的使用 HTTP请求与响应的基本格式 HTTP请求基本格式​编辑 HTTP响应基本格式 协议格式总结❗️❗️❗️​编辑 HTTP 详解 认识 URL URL基本格式 …

记一次IDOR 和访问控制缺失漏洞挖掘

视频教程在我主页简介和专栏里 测试 IDOR&#xff08;不安全的直接对象引用&#xff09; 漏洞时&#xff0c;我会使用一系列工具&#xff0c;确保不会遗漏任何问题。以下是我的测试方法&#xff1a; 设置 Firefox 和 Pwnfox&#xff1a; 1、我使用 Firefox 浏览器&#xff0c…

GS论文阅读--Hard Gaussian Splatting

前言 本文也是对高斯点云的分布进行优化的&#xff0c;看&#xff01; 文章目录 前言1.背景介绍2.关键内容2.1 位置梯度驱动HGS2.2 渲染误差引导HGS 3.文章贡献 1.背景介绍 在训练过程中&#xff0c;它严重依赖于视图空间位置梯度的平均幅度来增长高斯以减少渲染损失。然而&…

JS基础-操作数组(7)

一.增删改查 1.改 重新赋值 2.增 arr.puch() 末尾追加 arr.unshift() 开头追加 a)案例&#xff1a;数组筛选 3.删除 arr.pop() 删除最后一个元素 arr.shift() 删除第一个元素 splice&#xff08;&#xff09; 删除指定元素

C++otlv4连接sql serveer使用记录(注意点)

C使用otlv4在做插入时&#xff0c;有一些设计的坑需要注意 插入数据&#xff1a; 当要给表中插入单个字符时&#xff0c;数据库表设计使用varchar(1)是合理的&#xff0c;但是otlv4一直报错char。 后续查很久才知道&#xff0c;otlv4所写的绑定的字符数组的长度应该实际数组…

Chapter 6.5-Adding a classification head

Chapter 6 -Fine-tuning for classification 6.5-Adding a classification head 为进行分类微调&#xff0c;须修改预训练的大语言模型&#xff08;LLM&#xff09;。我们将原本把隐藏表征映射到含50,257个词的词表的输出层&#xff0c;替换为一个更小、仅映射到 “0&#xff…

洛谷题目 P1006 [NOIP2008 提高组] 传纸条 题解 (本题较难)

题目传送门&#xff1a; P1006 [NOIP2008 提高组] 传纸条 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 前言&#xff1a; 本题来源于2008年NOIp 提高组竞赛题目&#xff1a;传纸条&#xff0c;本题涉及到动态DP、图论里的费用流知识点&#xff0c;学过图论的都应该对这道题…

智能电动汽车 --- 人工智能(AI)入门

我是穿拖鞋的汉子&#xff0c;魔都中坚持长期主义的汽车电子工程师。 老规矩&#xff0c;分享一段喜欢的文字&#xff0c;避免自己成为高知识低文化的工程师&#xff1a; 简单&#xff0c;单纯&#xff0c;喜欢独处&#xff0c;独来独往&#xff0c;不易合同频过着接地气的生活…

VUE之路由Props、replace、编程式路由导航、重定向

目录 1、路由_props的配置 2、路由_replaces属性 3、编程式路由导航 4、路由重定向 1、路由_props的配置 1&#xff09;第一种写法&#xff0c;将路由收到的所有params参数作为props传给路由组件 只能适用于params参数 // 创建一个路由器&#xff0c;并暴露出去// 第一步…

VS C++ 配置OPENCV环境

VS C 配置OPENCV环境 1.下载opencv2.安装环境3.opencv环境4.VS配置opencv环境5.EXE执行文件路径的环境lib和dll需要根据是debug还是release环境来区分使用哪个 6.Windows环境 1.下载opencv 链接: link 2.安装环境 双击运行即可 3.opencv环境 include文件路径:opencv\build\…

【Redis】持久化机制

目录 前言&#xff1a; RDB 触发RDB持久化方法有俩种&#xff1a; 1.手动触发 2.自动触发 RDB文件的优缺点&#xff1a; AOF: AOF工作机制&#xff1a;​编辑 ​编辑重写机制&#xff1a; 前言&#xff1a; Redis是一个内存数据库&#xff0c;将数据存储在内存中&…

蓝桥杯lesson3---string的使用

&#x1f308;个人主页&#xff1a;羽晨同学 &#x1f4ab;个人格言:“成为自己未来的主人~” string的概念 string字符串是一种更加高级的封装&#xff0c;string字符串中包含了大量的方法&#xff0c;这些方法使得字符串的操作变得更加简单&#xff0c;string的使用&…