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

news/2025/3/17 7:50:29/

信号的发送的对象是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.ppmy.cn/news/1373672.html

相关文章

阿里云Linux系统MySQL8忘记密码修改密码

相关版本 操作系统&#xff1a;Alibaba Cloud Linux 3.2104 LTS 64位MySQL&#xff1a;mysql Ver 8.0.34 for Linux on x86_64 (Source distribution) MySQL版本可通过下方命令查询 mysql --version一、修改my.cnf文件 文件位置&#xff1a;etc/my.cnf进入远程连接后可以打…

机器学习---数据分割

之前的文章中写过&#xff0c;我们可以通过实验测试来对学习器的泛化误差进行评估并进而做出选择。 为此&#xff0c;需使用一个“测试集"(testing set)来测试学习器对新样本的判别能力&#xff0c;然后以测试集上的“测 试误差”(testing error)作为泛化误差的近似。通…

前端处理接口直接返回的图片

有时候接口会直接返回图片而不是连接&#xff0c;前端需要处理后才能使用。 首先你可能需要设置responseType: blob’处理响应数据格式。 直接使用 将接口及参数动态拼接成img.src直接使用 <img src"http://test.com/api/img?size50x50" alt"">i…

2023 年 3 月青少年软编等考 C 语言一级真题解析

目录 T1. 字符长方形思路分析 T2. 长方形面积思路分析 T3. 成绩等级转换思路分析 T4. 机智的小明思路分析 T5. 寻找特殊年号思路分析 T1. 字符长方形 给定一个字符&#xff0c;用它构造一个长为 4 4 4 个字符&#xff0c;宽为 3 3 3 个字符的长方形&#xff0c;可以参考样例…

如何查看rust开源库的可用版本?

在Rust中&#xff0c;可以使用Cargo包管理器和crates.io仓库来查看Rust开源库的可用版本。以下是一些步骤来查看Rust开源库的可用版本&#xff1a; 打开终端或命令提示符。 使用cargo search命令来搜索你感兴趣的库。例如&#xff0c;要搜索名为example-library的库&#xff…

利用excel批量修改图片文件名

今天同事提出需求要实现利用excel批量修改某文件夹下的图片重命名&#xff0c;衡量到各种条件&#xff0c;最后还是选择了vbs来实现。代码如下 代码 创建Excel对象 Set objExcel CreateObject("Excel.Application") objExcel.Visible False 隐藏Excel窗口 打开Ex…

vant van-field 密码输入框小程序里隐藏、显示密码bug总结

老规矩先上效果图: vant 输入框组件 密码的隐藏与显示功能&#xff1a; 注: 用password属性控制密码的显示与隐藏 不要用type属性&#xff0c;type属性在真机上有时会没有效果 1、当然如果只用typepassword 不需要切换显示、隐藏也可以使用。 2、如果用到了密码的显示与…

LeetCode141题:环形链表(python3)

数组&#xff0c;所有元素都连续的存储于一段内存中&#xff0c;且每个元素占用的内存大小相同。这使得数组具备了通过下标快速访问数据的能力。 但连续存储的缺点也很明显&#xff0c;增加容量&#xff0c;增删元素的成本很高&#xff0c;时间复杂度均为 O(n)。 增加数组容量需…