linux信号机制[二]

阻塞信号

信号相关概念

  • 实际执行信号的处理动作称为信号递达(Delivery)
  • 信号从产生到递达之间的状态,称为信号未决(Pending)。[收到信号但是没有处理]
  • 进程可以选择阻塞 (Block )某个信号。
  • 被阻塞的信号产生时将保持在未决状态,直到进程解除对此信号的阻塞,才执行递达的动作.
  • 注意,阻塞和忽略是不同的,只要信号被阻塞就不会递达,而忽略是在递达之后可选的一种处理动作。

忽略和阻塞处理的区别:

忽略代表信号已经抵达,并且处理了,处理的方式就是什么都不干。而阻塞则信号压根没有被递达。阻塞的信号如果不解除阻塞的话永远不会被递达,只有解除阻塞才可以。 

由上面的概念我们可以得出pcb内部其实由3张表

对padding的修改代表是否收到了信号,以及收到了什么信号。handler 是函数指针,代表着各个信号的实现方法。  自定义信号捕捉,就是把自己的函数处理方式填到handler里面。

在信号处理的时候方法是直接调用的吗?

NO对于我们传入的参数,他会先进行强制类型转换,如果等于1,执行默认行为,等于2忽略,都不等于才会执行调用对应的方法。

block表也是一个位图结构和padding一模一样。唯一的差别是位图中的内容代表信号是否被阻塞。

一个信号被处理的过程

操作系统修改padding位图,然后查找block表看是否被阻塞,然后进入对应的handler表执行处理方法。

sigset_t

每个信号只有一个bit的未决标志,非0即1,不记录该信号产生了多少次,阻塞标志也是这样表示的。因此,未决和阻塞标志可以用相同的数据类型sigset_t来存储,sigset_t称为信号集,这个类型可以表示每个信号 的“有效”或“无效”状态,在阻塞信号集中“有效”和“无效”的含义是该信号是否被阻塞,而在未决信号集中“有 效”和“无效”的含义是该信号是否处于未决状态。

阻塞信号集也叫做当前进程的信号屏蔽字(Signal Mask),这里的“屏蔽”应该理解为阻塞而不是忽略

基本上语言会给我们提供.h .hpp&&语言类自定义类型,同时os也会给我们提供.h和os自定义类型。sigset_t是一格位图结构但是不允许用户自己进行处理,操作系统提供对应的位操作方法。这个类型用户可以直接使用,和默认类型没有差别。

接口:

sigpending

#include<singal.h>

sigpending(sigset_t *set)

读取当前进程的未决(padding)信号集,通过set参数传出,拿给用户。调用成功则返回0,出错则返回-1。 

 sigprocmask

#include<singal.h>

int sigprocmask(int how, const sigset_t *set, sigset_t *oldset);

检查并更改阻塞信号集返回值:若成功则为0,若出错则为-1

如果oldset是非空指针,则读取进程的当前信号屏蔽字通过oldset参数传出(输出型参数)。如果set是非空指针,则 更改进程的信 号屏蔽字,参数how指示如何更改。如果oldset和set都是非空指针,则先将原来的信号 屏蔽字备份到oset里,然后 根据set和how参数更改信号屏蔽字。假设当前的信号屏蔽字为mask,下表说明了how参数的可选值:

小实验:

对所有信号进行捕捉——是不是就写了一个不会异常或者被杀掉的进程?

 #include<iostream>
 #include<signal.h>
//信号捕捉
void catchsig(int sigum)
{
    cout<<"捕捉到了信号:"<<sigum<<"pid:"<<"getpid()"<<endl;
}

int main()

{

    alarm(1);
    int count =0;
    while(1)
    {
        cout<<"cout :"<<count++<<endl;
    }
}

我们运行代码会发现一个现象,所有的信号都可以被捕捉,但是9号信号不可以被捕捉自定义。这个就是为了避免这种情况发生 。

如果将2号信号block,并不断获取pending信号机,如果发送一个2号信号我们是不是就应该看到pending中有一个比特位0->1? 是的

 #include<iostream>
 #include<unistd.h>
 #include<cassert>
 #include<signal.h>
void catsig(int signal)
{
    std::cout<<signal<<"signal信号被捕捉";
}


static void showpening(sigset_t &pending)
{
    for(int sig=1;sig<31;sig++)
    {
        if(sigismember(&pending,sig))//查看是不是在进程中
        {
            std::cout<<"1"<<std::endl;

        }
        else
        {
             std::cout<<"0"<<std::endl;

        }
    }
    std::cout<<std::endl;
}

int main()
{
    //1.定义信号集对象
    sigset_t set,oset;
    sigset_t pending;
    //2.初始化信号集
    sigemptyset(&set);
    sigemptyset(&oset);
    sigemptyset(&pending);
    //3.添加要屏蔽的信号
    sigaddset(&set,2);//
    //4.设置set到操作系统内核中【默认不会对任何信号block】
    int n=sigprocmask(SIG_BLOCK,&set,&oset);
    assert(n==0);
    (void)n;
    std::cout<<"block 2号信号成功"<<std::endl;
    //5.重复打印当前进程的信号集
    while(1)
    {
        //5.1获取当前进程padding集
        sigpending(&pending);
        //5.2显示pending中没有被递达地信号
        showpening(pending);
        sleep(1);
    } 
    return 0;
}

如果对所有的进程进行block——是不是就写了一个不会异常或者被杀掉的进程?

不会,9号以及19号信号不可以被捕捉阻塞或者屏蔽。

信号捕获之后可能无法处理,合适地时候是什么时候?流程是什么

合适的时候:信号相关字段在pcb内部(内核状态)。在内核态,返回用户态地时间进行信号地检测和处理。进行系统调用,缺陷陷阱等。int 80 特殊接口 内置在系统调用中。

内存映射页表,用户级页表,每个进程都有一份,不共有,内核级进程操作系统共有一份,通用。

捕捉信号

信号捕捉在处理信号的时候又出现新的信号 ,os如何处理呢?block。

!!信号捕捉没有创建新的线程和进程。

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

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

相关文章

“从根到叶:深入理解堆数据结构“

​​​​​​​ 一.堆的概念及实现 1.1堆的概念 在数据结构中&#xff0c;堆是一种特殊的树形数据结构。堆可以分为最大堆和最小堆两种类型。 最大堆&#xff1a;对于堆中的任意节点&#xff0c;其父节点的值都不小于它的值。换句话说&#xff0c;最大堆中的根节点是堆中的最…

猫头虎分享已解决Bug || Invariant Violation in React: Element Type is Invalid ‍

博主猫头虎的技术世界 &#x1f31f; 欢迎来到猫头虎的博客 — 探索技术的无限可能&#xff01; 专栏链接&#xff1a; &#x1f517; 精选专栏&#xff1a; 《面试题大全》 — 面试准备的宝典&#xff01;《IDEA开发秘籍》 — 提升你的IDEA技能&#xff01;《100天精通鸿蒙》 …

java 数据结构ArrayList类

目录 什么是List 线性表 顺序表 ArrayList类 ArrayList无参方法 ArrayList有参方法 &#xff1f;通配符 ArrayList 的remove方法 ArrayList 的subList方法 Iterator&#xff1a;迭代器 使用ArrayList完成杨辉三角 什么是List 在集合框架中&#xff0c;List是一个接…

vue 向某个网址 传递数据

1. 需求 现在有一个网站需要 配置上另一个网站的东西 类似这样的东西吧 就是我需要再一个网站上 右边或者其他地方 放另一个页面的地址 这个地址需要给我传递东西 或我这个网站给其他的网站传递token了 id等 2.解决 window.parent.postMessage({ token: loginRes.token, id:…

第5个-模糊加载

Day 5 - Blurry Loading 1. 项目展示 2. 分析思路 变化过程 数字从 0 不断增长到 100&#xff1b;中间的百分比数字逐渐消失&#xff0c;即透明度 opacity 从 1 到 0&#xff1b;背景图片从模糊变为清晰&#xff0c;滤镜 filter.blur()的参数设置为从 30px 到 0px。 小 tips…

点云旋转(基于PCL)

实现代码为&#xff1a; //以中心化点进行旋转double theta atan(maindirection.a);//计算的是弧度单位for (int i 0; i < origipts.size(); i){pcl::PointXYZ tempone;tempone.x aftercenerlizepts[i].x*cos(theta) aftercenerlizepts[i].y*sin(theta) center.x;temp…

Hive调优——合并小文件

目录 一、小文件产生的原因 二、小文件的危害 三、小文件的解决方案 3.1 小文件的预防 3.1.1 减少Map数量 3.1.2 减少Reduce的数量 3.2 已存在的小文件合并 3.2.1 方式一&#xff1a;insert overwrite (推荐) 3.2.2 方式二&#xff1a;concatenate 3.2.3 方式三&#xff…

【Zigbee课程设计系列文章】Zigbee开发环境搭建

【Zigbee课程设计系列文章】Zigbee开发环境搭建 前言IAR 下载安装Z-Stack协议栈安装 &#x1f38a;项目专栏&#xff1a;【Zigbee课程设计系列文章】&#xff08;附详细使用教程完整代码原理图完整课设报告&#xff09; 前言 &#x1f451;由于无线传感器网络&#xff08;也即…

RMSNorm原理及代码

RMSNorm原理及代码 在大模型中使用层归一化有如下几个因素&#xff1a; 改善网络稳定性加速收敛速度提高模型的泛化能力 批量归一化是对一个批次内的数据进行归一化 层归一化是对一个样本中的不同特征进行归一化 如下是LayerNorm与RMSNorm的公式 在LLaMA中使用RMSNorm替代…

【华为云】容灾方案两地三中心实践理论

应用上云之后&#xff0c;如何进行数据可靠性以及业务连续性的保障是非常关键的&#xff0c;通过华为云云上两地三中心方案了解相关方案认证地址&#xff1a;https://connect.huaweicloud.com/courses/learn/course-v1:HuaweiXCBUCNXI057Self-paced/about当前内容为灾备常见理论…

NARF关键点提取原理简介

一、NARF2D边缘点探测的矩形平面的边长s和计算点p和上邻域的距离所用的k值 二、障碍物边缘和阴影边缘 三、NARF边缘点探测 四、NARF借助边缘点信息进行关键点检测 本人也是参考其他博主&#xff0c;以及这份英文文献写的(毕竟是英文文献&#xff0c;部分翻译肯定有些误差&…

企业计算机服务器中了mkp勒索病毒怎么办?Mkp勒索病毒解密处理

随着网络技术的不断发展&#xff0c;企业的生产运营也加大了步伐&#xff0c;网络为企业的生产运营提供了强有力保障&#xff0c;但网络是一把双刃剑&#xff0c;给企业带来便利的同时也为企业带来了严重的数据威胁。春节期间&#xff0c;云天数据恢复中心接到很多企业的值班人…

反序列化漏洞(一)Shiro漏洞CVE-2016-4437复现

★★免责声明★★ 文章中涉及的程序(方法)可能带有攻击性&#xff0c;仅供安全研究与学习之用&#xff0c;读者将信息做其他用途&#xff0c;由Ta承担全部法律及连带责任&#xff0c;文章作者不承担任何法律及连带责任。 1、前言 春节后第一篇&#xff0c;祝大家龙年一切顺利&…

MySQL-运维

一、日志 1.错误日志 错误日志是MySQL中最重要的日志之一&#xff0c;它记录了当mysql启动和停止时&#xff0c;以及服务器在运行过程中发生任何严重错误时的相关性息。当数据库出现任何故障导致无法正常使用时&#xff0c;建议首先查看此日志。 该日志是默认开启的&#xf…

国产制造,欧美品质:爱可声助听器产品质量获国际认可

随着科技的发展和全球化的推进&#xff0c;越来越多的中国制造产品开始走向世界舞台。其中&#xff0c;爱可声助听器凭借其卓越的产品质量&#xff0c;成为了国产制造的骄傲。 国产制造指的是在中国境内生产的产品&#xff0c;欧美品质则是指产品在设计、生产、质量控制等方面…

CSS3学习(一)

1. 语法规范 CSS主要由选择器和一条或多条的声明构成。 选择器用于指定CSS样式的HTML标签&#xff0c;花括号里面是对应的具体样式 属性与属性值以键值对的形式出现&#xff0c;属性与属性之间用分号隔开 <head>里写<style> 2. 基础选择器 【作用】选择标签使…

【计算机网络】FTP 文件传输协议

同样使用TCP 但使用了两个并行的TCP 控制链接 control connection 带外 out-of-band 传送的数据链接 data connection 对于FTP而言&#xff0c;控制链接贯穿了整个用户会话期间&#xff0c;数据链接每传输一个文件就有一次建立FTP是有状态&#xff08;state&#xff09;的&…

【从Python基础到深度学习】4. Linux常用命令(进阶)

接上篇 【从Python基础到深度学习】4. Linux 常用命令-CSDN博客 1.文件查找 - find 命令 find [搜索路径] [搜索条件] [操作]1.1 常用选项和参数 -name&#xff1a;按文件名搜索。 find 命令的 -name 选项可以接受通配符来匹配文件名。通配符可以帮助你更灵活地搜索文件名&a…

【Web】NSSCTF Round#18 Basic个人wp(部分)

目录 ①门酱想玩什么呢&#xff1f; ②Becomeroot ①门酱想玩什么呢&#xff1f; 先试一下随便给个链接 不能访问远程链接&#xff0c;结合评论区功能&#xff0c;不难联想到xss&#xff0c;只要给个评论区链接让门酱访问就可 我们研究下评论区 从评论区知道&#xff0c;要…

建立知识体系,这份指南就够了

最近&#xff0c;许多读者私信我&#xff0c;问到这个问题。 恰好又要推送了&#xff0c;索性分享一些心得。 说实话&#xff0c;这是个很大的问题&#xff0c;要彻底讲透&#xff0c;大概得写一整本书。 所以&#xff0c;我尝试用尽量简洁的篇幅&#xff0c;将这个问题说清楚。…