LINUX系统编程:信号(2)

目录

2.信号的保存

2.1信号保存的基本概念

2.2信号在哪里保存的?怎么保存的?

2.3处理信号的三张表

2.4三张表的匹配操作和系统调用接口

2.4.1sigprocmask

2.4.2sigemptyset

2.4.3sigfillset

2.4.4sigaddset&&sigdelset

2.4.5sigismember

2.4.6sigpending

2.5demo代码

细节


2.信号的保存

2.1信号保存的基本概念

处理信号的动作叫做递达(Delivery),处理信号有三种方式,默认,忽略,自定义。

信号从产生到信号递达之间的状态叫做未决(Pending)。

进程可以选择阻塞(Block)某个信号。

2.2信号在哪里保存的?怎么保存的?

信号是在进程pcb中被保存的,也就是task_struct中。

保存的方式采用的是位图。

struct
{
    unsigned long int pending;
    unsigned long int block;
};

pending:比特位的位置表示信号的编号,比特位的内容表示是否是未决的。

block:比特位的位置表示信号的编号,比特位的内容表示是否是阻塞。

阻塞和忽略不是一个概念

阻塞是阻止信号递达,忽略是递达之后忽略。

2.3处理信号的三张表

block就是block位图,pending就是pending位图,handler是一个函数指针数组。

当进程收到2信号,首先会将pending位图第二比特位变为1,等到机会合适时处理pending中的信号,处理时会看2号信号的位置在block中是否为1,如果为1就阻塞住,不递达,为0就递达,调用handler中对应的函数。

2.4三张表的匹配操作和系统调用接口

2.4.1sigprocmask

查看和修改阻塞信号,就是修改block位图。

how:如何修改

set:信号集

sigset_t类型是一个结构体,__val就是和pending一样的位图。

#define _SIGSET_NWORDS (1024 / (8 * sizeof (unsigned long int)))
typedef struct
{
  unsigned long int __val[_SIGSET_NWORDS];
} __sigset_t;

oldset:输出型参数,将未修改之前的位图保存。

返回值

成功返回0,失败返回-1

2.4.2sigemptyset

将参数set初始化,并把所有信号都清空。

2.4.3sigfillset

将set初始化,包含所有信号。

2.4.4sigaddset&&sigdelset

向set信号集中添加或者删除信号,参数signum就是添加几号信号。

2.4.5sigismember

检查set信号集中是否包含signum

包含返回1,不包含返回0,出错返回-1.

2.4.6sigpending

检查pending位图

set是输出型参数。

2.5demo代码

1.屏蔽2号信号

2.打印pending位图中的内容

3.向进程发送2号信号,因为2号信号被阻塞了,所以2号信号会一直在pending位图中。

#include<iostream>
#include<signal.h>
#include<string.h>
#include<cerrno>

void print(sigset_t* s)
{
    for(int i = 31; i > 0; i--)
    {
        if(sigismember(s,i) == 1)
        {
            std::cout<<"1";
        }
        else if(sigismember(s,i) == 0)
        {
            std::cout<<"0";
        }
        else
        {
            std::cout<<"sigismember fail:"<<strerror(errno)<<std::endl;
        }
    }
    std::cout<<std::endl;
}

int main()
{   
    sigset_t s;
    sigset_t output;
    sigemptyset(&s);
    sigaddset(&s,2);
    sigprocmask(SIG_SETMASK,&s,&output);
    sigset_t pend;
    while(true)
    {
        sigpending(&pend);
        print(&pend);
        sleep(1);
    }
    return 0;
}

 使用kill命令向进程sigPreserve发送2号信号

pending位图的2号信号位置果然变为1了。

那是不是这个进程把所有的信号都屏蔽了,那这个进程是不是就无敌了我们可以试验一下。

直接将所有信号阻塞,看有没有信号可以杀死该进程。

我们发现,1-8号都成功的被阻塞了,但是9号信号直接杀死了进程。

SIGKILL (9):这是一个强制终止进程的信号,通常由系统管理员或者操作系统自身发送。它无法被阻塞,因为它的目的是强制终止进程,即使进程已经阻塞了所有其他信号。

SIGSTOP (19) 和 SIGCONT (18):SIGSTOP 用于暂停进程的执行,SIGCONT 用于继续执行被暂停的进程。它们也是不可阻塞的,因为它们是用来控制进程执行状态的信号,不受进程阻塞的影响。

细节

1.信号被递达的时候一定会把对应的pending位图清空。

2.先清空pending位图,再递达

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

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

相关文章

代码随想录 day 30

回溯总结&#xff1a; 相当于暴力for循环&#xff0c;其目的用递归控制for循环嵌套的数量。当剪枝时&#xff0c;就可以使得嵌套数量减少。把回溯问题抽象一颗树比较好懂。并且使得代码更简洁。 对于组合问题&#xff0c;什么时候需要startIndex呢&#xff1f; 在一个集合求组合…

awdawdawd

c语言中的小小白-CSDN博客c语言中的小小白关注算法,c,c语言,贪心算法,链表,mysql,动态规划,后端,线性回归,数据结构,排序算法领域.https://blog.csdn.net/bhbcdxb123?spm1001.2014.3001.5343 给大家分享一句我很喜欢我话&#xff1a; 知不足而奋进&#xff0c;望远山而前行&am…

Java+前端+Vue 后端Spring boot 开发的全套UWB定位方案,0.1米高精度定位系统源码

Java前端Vue 后端Spring boot 开发的全套UWB定位方案,0.1米高精度定位系统源码 UWB定位系统由硬件定位设备、定位引擎和应用软件组成。该定位系统应用软件支持PC端和移动端访问&#xff0c;并提供位置实时显示、历史轨迹回放、人员考勤、电子围栏、行为分析、智能巡检等功能…

深度学习中torch.max函数的作用

文章目录 解释代码举例 解释 torch.max 是 PyTorch 中的一个函数&#xff0c;用于在张量中沿指定维度计算最大值。它有两种用法&#xff1a; ① 如果只提供一个输入张量&#xff0c;则返回该张量中的最大值和对应的索引。     ② 如果提供两个输入张量&#xff0c;则返回两…

【管理咨询宝藏125】超大型集团组织架构设计方案报告

本报告首发于公号“管理咨询宝藏”&#xff0c;如需阅读完整版报告内容&#xff0c;请查阅公号“管理咨询宝藏”。 【管理咨询宝藏125】超大型集团组织架构设计方案报告 【格式】PDF版本 【关键词】人力咨询、组织架构设计、流程优化 【核心观点】 - 通过组织诊断看到&#x…

Python怎么发邮件不会被拦?如何设置信息?

Python发邮件的注意事项&#xff1f;Python发邮件需要哪些库&#xff1f; 使用Python发送电子邮件是一个常见的需求。然而&#xff0c;有时候邮件可能会被拦截&#xff0c;要确保发送的邮件不被拦截&#xff0c;需要一些技巧和注意事项。AokSend将介绍如何使用Python发送邮件&…

用友NC BeanShell远程命令执行(CNVD-2021-30167)漏洞复现

1.简介 用友NC是一款企业级管理软件&#xff0c;在大中型企业广泛使用。实现建模、开发、继承、运行、管理一体化的IT解决方案信息化平台。用友 NC bsh.servlet.BshServlet目录存在远程命令执行漏洞&#xff0c;可通过BeanShell 执行远程命令获取服务器权限。 貌似所有版本都存…

Python邮件群发有哪些步骤?如何批量发送?

Python邮件群发的注意事项&#xff1f;怎么使用Python群发邮件&#xff1f; 使用Python进行邮件群发&#xff0c;不仅可以自动化流程&#xff0c;还可以节省大量的时间和精力。AokSend将详细介绍使用Python进行邮件群发的步骤&#xff0c;并在过程中提供实用的建议和注意事项。…

【第7章】SpringBoot实战篇之用户详细信息

文章目录 前言一、获取用户详细信息1. ThreadLocalUtil2. LoginInceptor3. UserController14. 测试 二、更新用户基本信息1.ValidatedGroups2.User3. UserController14. service5. 测试1. 参数校验2. 更新测试 三、更新用户头像1. UserController12. 测试 四、更新用户密码1. U…

RAD和TOT效率

最近在用CST仿真天线&#xff0c;如下自己建了一个倒F的蓝牙天线&#xff1a; 然后使用波导端口给予激励&#xff0c;大概仿真的S参数如下&#xff1a; 同时查看CST仿真效率图中发现有两个参数效率参数&#xff1a;RAD和TOT效率&#xff0c;如下&#xff1a; 具体是什么意思呢&…

设计模式之观察者模式ObserverPattern(十一)

一、概述 观察者模式 (Observer Pattern) 是一种行为型设计模式&#xff0c;又被称为发布-订阅 (Publish/Subscribe) 模式&#xff0c;它定义了对象之间的一种一对多的依赖关系&#xff0c;使得当一个对象的状态发生变化时&#xff0c;所有依赖于它的对象都会自动收到通知并更新…

云原生架构案例分析_1.某旅行公司云原生改造

随着云计算的普及与云原生的广泛应用&#xff0c;越来越多的从业者、决策者清晰地认识到“云原生化将成为企业技术创新的关键要素&#xff0c;也是完成企业数字化转型的最短路径”。因此&#xff0c;具有前瞻思维的互联网企业从应用诞生之初就扎根于云端&#xff0c;谨慎稳重的…

2年JAVA今日头条3轮面试经历

面头条的时候已经是十月底了。大半个月没有面试&#xff0c;之前准备的知识点比如http状态码之类的记忆性的东西&#xff0c;早就忘光了。 二面的时候问了一堆状态码&#xff0c;全都不记得了。面试官态度很好&#xff0c;跟我说&#xff0c;你现在不记得了&#xff0c;说明你…

STM32远程更新

1 IAP 概述 1.1 工作原理 在应用中编程&#xff08; IAP &#xff09;是一种在现场通过 MCU 的通信接口&#xff08;例如 UART,USB,CAN 和以太网 等&#xff09;进行固件升级的方式。 当启动微控制器时&#xff0c;您可以选择让它进入 IAP 模式以执行 IAP 代码&am…

企业级数据保护:华企盾DSC敏感内容识别与加密技术

在当今数字化时代&#xff0c;企业面临的数据安全挑战日益严峻。敏感数据的泄露不仅会导致经济损失&#xff0c;还可能损害企业的声誉和客户信任。因此&#xff0c;采用先进的敏感内容识别和加密技术&#xff0c;例如华企盾DSC敏感内容识别&#xff0c;对企业数据进行有效保护至…

PyCharm如何更换解析器为Anaconda,如何自己切换python环境

自己使用了Anaconda创建了一个环境&#xff1a; 如何在工具PyCharm中切换自定义的python环境呢&#xff1f; 1. 点击 设置 2. 项目&#xff1a;python - Python解析器 此时会发现&#xff0c;只有一个默认的版本。 3. 点击 添加解析器 - 添加本地解析器 4. 选择 conda 环境…

全球AI新闻速递6.6

1.伏羲升级&#xff01;智能气象创新生态联盟成立。 2.微软&#xff1a;首个大规模大气基础模型Aurora。 3.鸿海集团&#xff1a;宣布在高雄建造先进算力中心&#xff0c;与NVIDIA在 AI 领域合作展开多方面合作。 4.全球首个全切片数字病理学模型GigaPath发布。 5.OpenAI与…

DDS自动化测试落地方案 | 怿星科技携最新技术亮相是德科技年度盛会

5月28日&#xff0c;怿星科技作为是德科技的重要合作伙伴亮相Keysight World Tech Day 2024。在此次科技盛会上&#xff0c;怿星科技不仅展示了领先的DDS自动化测试解决方案等前沿技术&#xff0c;还分享了在“周期短、任务重”的情况下&#xff0c;如何做好软件开发和测试验证…

指纹考勤机的运用办法,指纹考勤机一台多少钱

指纹考勤机的运用办法&#xff0c;指纹考勤机一台多少钱 通常普通的指纹考勤机仅需几十元到一百元上下&#xff0c;只具备单纯的打卡功能&#xff0c;使用体验较差&#xff1b;这种考勤机仅有基础的指纹打卡时间记录&#xff0c;拷贝需要 U 盘&#xff0c;整理则需人员进…

多曝光融合算法(三)cv2.createAlignMTB()多曝光图像融合的像素匹配问题

文章目录 1.cv2.createAlignMTB() 主要是计算2张图像的位移&#xff0c;假设位移移动不大2.多曝光图像的aline算法&#xff1a;median thresold bitmap原理讲解3.图像拼接算法stitch4.多曝光融合工具箱 1.cv2.createAlignMTB() 主要是计算2张图像的位移&#xff0c;假设位移移动…