LIUNX系统编程:信号(3)

目录

3.信号的处理

3.1信号是什么时候被处理的

read系统调用

3.2信号是怎样被处理的

内核态和用户态

 3.3操作系统是如何运行处理信号的呢?

中断技术

什么让操作系统运行起来的

3.4捕捉信号的其他方式

​编辑

demo代码


3.信号的处理

3.1信号是什么时候被处理的

信号在发送给进程之后不是立即处理的,而是等到合适的机会,在去处理信号的。

什么是合适的机会呢?

进程从内核态要切换回用户态时,会检测处理信号。

为什要内核态才能处理信号呢?

因为处理信号的时候一定会对内核数据结构做修改,就像在处理信号之前,要把pending表中信号对应的bit位置为0,然后去调用handler函数,处于用户态的时候是不允许让问内核数据的。

这里可能会有个问题,直接使用系统调用不就能对内核数据进行修改吗?还用上面说的来回切换多麻烦啊?

这是因为在执行系统调用的时候,也会切换到内核态的,举个例子。

read系统调用

1.将参数拷贝到内核

2.切换为内核态

3.在task_struct中找到文件描述符表。

4.访问0号fd的文件,将该文件的缓冲区拷贝到buffer中

5.将结果返回给用户。

6.返回用户态

信号的大致处理流程就是这样的。

但是自定义和默认处理方式流程是有区别的。

自定义处理:执行sighandler需要切换回用户态,去执行自定义的函数,然后返回内核态,内核态在返回运行结果给用户态。

默认处理:直接在内核态执行默认的sighandler函数,然后返回用户态即可。

 

3.2信号是怎样被处理的

内核态和用户态

进程的虚拟地址空间,分为用户区0-3g,和内核区3-4g,一共是4g。

这也就是为什么,进程总能找到操作系统,让操作系统替进程执行一些动作。

操作系统被映射到了,进程的地址空间内,经过mmu+页表将虚拟的地址转化为物理地址,就找到操作系统了。

内核级的页表只有一份,因为操作系统只有一个,操作系统的内核数据也只有一份,只需要一个内核级的页表,建立不同进程的虚拟地址到操作系统所处物理内存的映射,就可以让多个进程看到一个操作系统。

但是进程是有多个的,每个进程的数据也是不同的,这就需要不同的页表,来映射不同的进程。

 3.3操作系统是如何运行处理信号的呢?

首先呢操作系统是一个功能强大的傀儡,它没有自己的思想,得有人告诉操作系统要做什,它才会去做,不然操作系统什么都不会做。

中断技术

信号技术本质就是软件中断,软件中断就是对硬件中断的模拟。

 硬件中断:键盘直接连接到cpu的针脚上,当键盘输入的时候,会给对应的针脚一个高电频,cpu会拿着这个针脚的编号,去操作系统的中断向量表(函数指针数组),执行对应的函数。

软件中断:由软件产生一个中断信号,然后去操作系统的终端向量表,执行对应的函数。

重谈read方法

cs的寄存器的后两位是权限标识位。00代表是内核态,11代表用户态。

首先判断当前是不是用户态,是就把系统调用表中对应系统调用的编号放入eax寄存器中。

执行int 0x80指令陷入内核态,执行系统调用。

什么让操作系统运行起来的

操作系统是一个死循环,不断的接受其他外部的中断。

由一个硬件,向操作系统发送一个频率非常高,时间非常短的周期时钟中断,操作系统会拿着中断号去操作系统的中断向量表中,执行进程调度,内存管理,更新系统时间。。。任务。

3.4捕捉信号的其他方式

在处理信号的时候,会讲处理的信号屏蔽,防止一直接受同一个信号陷入循环。

参数:

signum是想要捕捉的信号,或者一些选项(不介绍)。

act:act是个结构体,含有一下内容。

        sa_handler是想要自定处理的函数

        sa_sigaction处理实时信号

        sa_mask除了屏蔽当前信号,还要屏蔽哪些信号。

        sa_flag是一些选项。

oldact:输出型参数,将原来信号的处理保存到oldact中。

demo代码

使用一下这个接口,屏蔽2号信号的同时屏蔽3,4,5号信号。

看下现象,运行起来的pending位图2,3,4,5的位置应该都是1。

验证

#include<signal.h>
#include<iostream>
#include<unistd.h>

void print(sigset_t &pending)
{
    for(int i = 31; i >= 1; i--)
    {
        if(sigismember(&pending,i))
        {
            std::cout<<"1";
        }
        else
        {
            std::cout<<"0";
        } 
    }
    std::cout<<std::endl;
}


void handler(int signo)
{
    //获取pending并打印
    sigset_t pending;
    sigemptyset(&pending);
    while(true)
    {
        sigpending(&pending);//获取pending位图
        print(pending);//打印pending
        sleep(1);
    }

}


int main()
{
    struct sigaction act,oact;
    act.sa_handler = handler;
    act.sa_flags = 0;
    sigemptyset(&act.sa_mask);//初始化信号集
    sigaddset(&act.sa_mask,3);//在信号集中添加3号信号
    sigaddset(&act.sa_mask,4);
    sigaddset(&act.sa_mask,5);

    sigaction(2,&act,&oact);//捕捉信号
    while(true)
    sleep(1);
    return 0;
}

第一次kill-2让信号被捕捉,第二次就直接被阻塞在pending位图中。

kill -3 -4 -5每次pending位图对应的位置都会变为1.

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

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

相关文章

当C++的static遇上了继承

比如我们想要统计下当前类被实例化了多少次&#xff0c;我们通常会这么写 class A { public:A() { Count_; }~A() { Count_--; }int GetCount() { return Count_; }private:static int Count_; };class B { public:B() { Count_; }~B() { Count_--; }int GetCount() { return …

谷歌的AI大变革:商业模式转型

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

数字模拟EDA研发环境搭建

中小企业数字模拟EDA研发环境部署、集群搭建、网络配置、硬件咨询、数据备份、技术指导、环境生命周期维护等&#xff0c;Cadence、Synopsys、Mentor、Keysight、ANSYS&#xff0c;MATLAB、Xilinx等厂商软件工具安装调试。 EDA研发环境搭建经验交流&#xff0c;请加V

数据泄露防护(DLP)系统有哪些?2024年数据泄露防护系统TOP5排名

数据泄露防护&#xff08;DLP&#xff09;系统是企业为确保敏感信息不被非法访问、使用或泄露而采用的重要安全策略。以下是一些常见的数据泄露防护系统&#xff0c;以及它们的功能和优点。 1、安企神 DLP 安企神 DLP是一款为企业研发的数据防泄漏系统&#xff0c;以强大的功能…

超过20W个高质量组件的开源PCB库

项目介绍 Celestial Altium Library是由Altium行业专家Mark Harris创建的一个庞大的免费开源数据库库&#xff0c;专为Altium Designer而设计&#xff0c;库中包含超过20万个优质组件 . 特点 高质量数据&#xff1a;Celestial Altium Library注重数据的质量&#xff0c;用户可…

AIGC之Stable Diffusion Web Ui 初体验

前言 Stable Diffusion辣么火&#xff0c;同学你确定不尝试一下嘛&#xff1f; 纯代码学习版本搞啦&#xff0c;Web Ui 也得试试咧 网上有很多安装Stable Diffusion Web Ui 的介绍了&#xff0c;我在这说一下我的踩坑记录 想安装的同学&#xff0c;看这个链接 万字长文&#x…

采用JWT令牌和Filter进行登录拦截认证

原理描述&#xff1a; 1、第一次登录的时候&#xff0c;生成JWT令牌&#xff0c;并JWT令牌存放在localStorage。 localStorage.setItem(token, token); 2、每次通过axios发送请求的时候&#xff0c;都将这个令牌获取&#xff0c;并放于header中发送。 也就是JWT令牌只在登录…

【Linux】Centos7升级内核的方法:yum更新(ELRepo)

&#x1f60e; 作者介绍&#xff1a;我是程序员洲洲&#xff0c;一个热爱写作的非著名程序员。CSDN全栈优质领域创作者、华为云博客社区云享专家、阿里云博客社区专家博主。 &#x1f913; 同时欢迎大家关注其他专栏&#xff0c;我将分享Web前后端开发、人工智能、机器学习、深…

SpringCloud中注册中心Nacos的下载与使用步骤

1.前言 Nacos&#xff08;Dynamic Naming and Configuration Service&#xff09;是阿里巴巴开源的一款服务发现和配置管理工具。它可以帮助用户自动化地进行服务注册、发现和配置管理&#xff0c;是面向微服务架构的一个重要组成部分。 2.下载 链接&#xff1a;https://pan.b…

redis学习路线

待更新… 一、nosql讲解 1. 为什么要用nosql&#xff1f; 用户的个人信息&#xff0c;社交网络&#xff0c;地理位置&#xff0c;自己产生的数据&#xff0c;日志等等爆发式增长&#xff01;传统的关系型数据库已无法满足这些数据处理的要求&#xff0c;这时我们就需要使用N…

JAVA-LeetCode 热题-第24题:两两交换链表中的节点

思路&#xff1a; 定义三个指针&#xff0c;其中一个临时指针&#xff0c;进行交换两个节点的值&#xff0c;重新给临时指针赋值&#xff0c;移动链表 class Solution {public ListNode swapPairs(ListNode head) {ListNode pre new ListNode(0,head);ListNode temp pre;wh…

知识图谱的应用---智慧教育

文章目录 智慧教育典型应用 智慧教育 根据《中国互联网教育平台专题分析2018》&#xff0c;2017年中国互联网教育市场规模达到2502亿元人民币,同比增长56.3%&#xff0c;但相比线下整体教育行业而言&#xff0c;互联网教育占比仍然较低,尚有巨大的发展空间。在消费升级、知识付…

计算机网络面试基础(一)

文章目录 一、HTTP基本概念1.HTTP是什么&#xff1f;2.HTTP 常见的状态码有哪些&#xff1f;3.http常见字段 二、GET和POST1.get和post有什么区别 三、HTTP缓存技术1.HTTP 缓存有哪些实现方式&#xff1f;2.什么是强制缓存&#xff1f;3.什么是协商缓存&#xff1f;(不太懂) 四…

Visual C++ Redistributable下载

安装程序的时候提示丢失mfc140u.dll 如下图,查了资料说可以下载Visual C Redistributable来进行处理 下载Visual C Redistributable 1.打开网站 https://www.microsoft.com/zh-cn/download/details.aspx?id48145&751be11f-ede8-5a0c-058c-2ee190a24fa6True) 2.点击下载 …

算法:94. 二叉树的中序遍历

给定一个二叉树的根节点 root &#xff0c;返回 它的 中序 遍历 。 示例 1&#xff1a; 输入&#xff1a;root [1,null,2,3] 输出&#xff1a;[1,3,2]示例 2&#xff1a; 输入&#xff1a;root [] 输出&#xff1a;[]示例 3&#xff1a; 输入&#xff1a;root [1] 输出&am…

刷完50题,搞定十大网络基础知识

号主&#xff1a;老杨丨11年资深网络工程师&#xff0c;更多网工提升干货&#xff0c;请关注公众号&#xff1a;网络工程师俱乐部 上午好&#xff0c;我的网工朋友 咱新手网工&#xff0c;入行之前最需要做的准备之一&#xff0c;就是抓住网络基础知识&#xff0c;毕竟是饭碗&…

信息学奥赛初赛天天练-22-C++基础关键字、进制转换、结构体与联合体的实用技巧大揭秘

PDF文档公众号回复关键字:20240607 单项选择题&#xff08;共15题&#xff0c;每题2分&#xff0c;共计30分&#xff1a;每题有且仅有一个正确选项&#xff09; 1 在C中&#xff0c;下面哪个关键字用于声明一个变量&#xff0c;其值不能被修改&#xff1f;&#xff08; &#…

讯方618代表有话说 | 行业大咖详解鸿蒙,全程在线答疑

讯方618“代表有话说” 系列专场直播活动来啦 6月11日&#xff08;周二&#xff09;19:30 本期直播特邀华为、学校、讯方代表 与大家畅聊鸿蒙奥秘 共同开启未来技术之门&#xff01; 行业大咖将带大家 了解鸿蒙概况和岗位需求 解析鸿蒙系统强势崛起带来的影响 解读高校…

常见Rabbitmq面试题及答案总结

1、 什么是 rabbitmq 釆用AMQP高级消息队列协议的一种消息队列技术撮大的特点就是消费并不需要 确保提供方存在,实现了服务之间的高度解耦 2、 为什么要使rabbitmq &#xff08;1&#xff09; 在分布式系统下具备异步&#xff0c;削峰&#xff0c;负载均衡等一系列高级功能&…

openh264 场景变化检测算法源码分析

文件位置 openh264/codec/processing/scenechangedetection/SceneChangeDetection.cppopenh264/codec/processing/scenechangedetection/SceneChangeDetection.h 代码流程 说明&#xff1a; 通过代码流程分析&#xff0c;当METHOD_SCENE_CHANGE_DETECTION_SCREEN场景类型为时…