Linux-信号执行

news2024/11/18 15:22:19

1. 信号什么时候被处理

        当进程从内核态返回到用户态的时候,进行信号的检测和处理

什么内核态,什么又是用户态呢?

        当进程在CPU上运行时,内核态:允许进程访问操作系统的代码和数据,用户态:进程只能访问用户自己的代码和数据

为什么要有,用户态和内核态呢?

        因为进程需要访问系统内的资源,以及调用系统函数接口,例如IO就是系统调用,一个进程只有在内核态通过系统调用才能访问操作系统的资源,这样可以保证系统的安全性

从用户态切换到内核态的方式:

  • 系统调用(int 80)
  • 异常
  • 外围设备中断

        CPU内部有一个ecs寄存器,它的后两位标识进程属于内核态还是用户态,00标识内核态,11标识用户态。int 80 汇编语句可以让ecs从11变成00,从用户态切换到内核态

内核态和用户态分离是如何实现的?

         操作系统的代码和数据在物理内存中只有一份,在计算机刚刚启动的时候,就是在加载OS,内核级页表在操作系统中也是只有一份,它映射整个操作系统的代码和数据,而且每个进程的虚拟内存的内核空间的内容都是一样的,都是通过内核级页表映射来的。每个进程共享内核空间,而用户空间是进程独有的,所以用户级页表有很多个,每个进程独有一份。

        每个进程需要访问系统资源,调用系统接口,就会从用户态切换到内核态,代码从用户区的代码跳转到内核区执行,当内核区的代码执行完,就会返回用户区,也就会从内核态切回用户态,也就是这个时候,检测进程的pending信号集。

2. 信号如何被处理

处理流程:

        如果信号的处理动作不是自定义的,那么就会在第三步处理信号,处理完毕后如果进程还活着,就返回用户模式,并继续执行

        sighandler和main是两个独立的控制流,使用的是不同的栈空间

在上一篇博客留下了一个问题:

如果调用sigprocmask解除了对当前若干个未决信号的阻塞,则在函数返回前,至少将其中一个信号递达(在下一篇博客中解答为什么)

        因为当调用sigprocmask,也就是系统调用,就会从用户态切换到内核态,在函数返回前,也就是从内核态切回到用户态前,会进行信号检测,也就会信号递达,至少一个是为啥呢?

        这是因为可能在自定义信号处理的过程中发生状态切换,可能是系统调用,也可能是中断,都有可能。自定义信号处理是上面图的第四步,处于用户态,如果切换成内核态再切回的过程中,就会再一次处理信号。甚至可以一直这样。

        但是这种情况,有时候并不是我们想要的,例如一个进程一直再给另一个进程发送某个信号,这就可能会出现,当前自定义的信号还没处理完,接着又去处理下一个信号。特别是同一个信号,最容易出现这种情况,会死循环。

        但是其实操作系统提供了对应的接口设置,操作系统的设计者已经想到了

 函数功能:

        自定义信号的处理方法,设置信号屏蔽字,当处理该信号时,内核会提前把sa_mask加入到block位图中,默认会把当前信号加入,确保在自定义函数处理过程中,不会再处理不想处理的信号,信号处理函数返回时自动恢复原来的信号屏蔽字

参数:

        signum:信号编码

        act:设置信号处理方法,输入型参数

        oldact:旧的信号处理方法会通过oldact传出,输出型参数

返回值:

        0标识成功,-1标识失败

        在Linux下,当子进程退出或者暂停时,会向父进程发送SIGCHLD信号,父进程对于SIGCHLD信号的默认处理动作是忽略,但是我们知道,如果父进程不等待回收子进程,子进程会一直保持僵尸状态,进程PCB会保持下来。

        但是如果我们想要子进程自己处理完,就退出并且释放自己的资源,父进程不关心子进程的退出结果,要怎么办呢?

        可以通过sigaction或者signal修改信号的默认处理动作为SIG_IGN,这样就可以,可见Linux下系统的默认处理动作为忽略和自定义处理动作忽略还是有区别的。

        当然这里我们也可以当父进程修改信号自定义处理动作为非阻塞等待,来获取子进程退出的结果,代码如下:

#include <iostream>
#include <signal.h>
#include <unistd.h>
#include <sys/types.h>
#include <wait.h>

using namespace std;

void handler(int sig)
{
    cout << "捕捉到:" << sig << endl;
    int status = 0;
    pid_t pid = 0;
    while((pid = waitpid(-1, &status, WNOHANG)) > 0)
    {
        cout << "child pid" << pid << endl;
        cout << "!!!!!!!!!!!!" << endl;
        if(WIFEXITED(status))
            cout << "退出码为:" << WEXITSTATUS(status) << endl;
        else if(WIFSIGNALED(status))
            cout << "终止信号:" << WTERMSIG(status) << endl;
    }
}

// 回收子进程通过信号
int main()
{
    struct sigaction act;
    act.sa_handler = handler;
    sigaction(SIGCHLD, &act, nullptr);
    // 4. 自定义SIG_IGN
    signal(SIGCHLD, SIG_IGN);
    if(fork() == 0)
    {
        cout << "child pid" << getpid() << endl;
        sleep(5);
        exit(0);
    }
    while(true) sleep(1);
    return 0;
}

        完。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Kubernetes容器技术详解

kubernetes Kubernetes&#xff08;K8s&#xff09;由Google打造&#xff0c;是一款功能强大、灵活可扩展的容器编排平台&#xff0c;引领云原生技术潮流。 Kubernetes主要解决以下4大点&#xff1a; 1.自动化运维平台 如下图所示&#xff1a; Kubernetes携手Docker&#xf…

【go项目01_学习记录08】

学习记录 1 模板文件1.1 articlesStoreHandler() 使用模板文件1.2 统一模板 1 模板文件 重构 articlesCreateHandler() 和 articlesStoreHandler() 函数&#xff0c;将 HTML 抽离并放置于独立的模板文件中。 1.1 articlesStoreHandler() 使用模板文件 . . . func articlesSt…

【动态规划】:路径问题_地下城游戏

朋友们、伙计们&#xff0c;我们又见面了&#xff0c;本专栏是关于各种算法的解析&#xff0c;如果看完之后对你有一定的启发&#xff0c;那么请留下你的三连&#xff0c;祝大家心想事成&#xff01; C 语 言 专 栏&#xff1a;C语言&#xff1a;从入门到精通 数据结构专栏&…

怎么用AI软件设计字体

一 工具准备 软件&#xff1a;Adobe illustrator 如下网盘自取 链接&#xff1a;https://pan.baidu.com/s/1hlImpN4QlsSkOLLUxINOGA 提取码&#xff1a;love 安装的时候看不全界面&#xff0c;多按几下tab键就能看到按钮。 直接找一款喜欢的字体修改&#xff0c;字体包如下…

PyCharm安装教程(超详细图文教程)

一、下载和安装 1.进入PyCharm官方下载&#xff0c;官网下载地址&#xff1a; https://www.jetbrains.com/pycharm/download/ 专业版安装插件放网盘了&#xff0c;网盘下载即可&#xff1a;itcxy.xyz/229.html2.安装 1.下载后找到PyCharm安装包&#xff0c;然后双击双击.ex…

【连连国际注册_登录安全分析报告】

连连国际注册/登录安全分析报告 前言 由于网站注册入口容易被黑客攻击&#xff0c;存在如下安全问题&#xff1a; 暴力破解密码&#xff0c;造成用户信息泄露短信盗刷的安全问题&#xff0c;影响业务及导致用户投诉带来经济损失&#xff0c;尤其是后付费客户&#xff0c;风险巨…

【ytb数据采集器】按关键词批量爬取视频数据,界面软件更适合文科生!

一、背景介绍 1.1 爬取目标 用Python独立开发的爬虫工具&#xff0c;作用是&#xff1a;通过搜索关键词采集油管的搜索结果&#xff0c;包含14个关键字段&#xff1a;关键词,页码,视频标题,视频id,视频链接,发布时间,视频时长,频道名称,频道id,频道链接,播放数,点赞数,评论数…

Eigen求解线性方程组

1、线性方程组的应用 线性方程组可以用来解决各种涉及线性关系的问题。以下是一些通常可以用线性方程组来解决的问题&#xff1a; 在实际工程和科学计算中&#xff0c;求解多项式方程的根有着广泛的应用。 在控制系统的设计中&#xff0c;我们经常需要求解特征方程的根来分析…

链式二叉树的基本操作1

1.概念回顾 讲二叉树的基本操作之前&#xff0c;我们回顾一下二叉树的概念 在讲树之前&#xff0c;我们的每讲一种数据结构&#xff0c;无外乎就是在讲它们的增删查改&#xff0c;但是在树这里&#xff0c;就有了不小变化。 2.结点的定义 既然是链式二叉树&#xff0c;那必须…

Python sqlite3库 实现 数据库基础及应用 输入地点,可输出该地点的爱国主义教育基地名称和批次的查询结果。

目录 【第11次课】实验十数据库基础及应用1-查询 要求: 提示: 运行结果&#xff1a; 【第11次课】实验十数据库基础及应用1-查询 声明&#xff1a;著作权归作者所有。商业转载请联系作者获得授权&#xff0c;非商业转载请注明出处。 1.简答题 数据库文件Edu_Base.db&#…

FreeRTOS的任务详解、创建与删除

目录 1、任务详解 1.1 什么是任务&#xff1f; 1.2 任务的特点 1.3 任务的状态 1.4 任务的优先级 1.5 任务的堆和栈 2、任务的创建与删除 2.1 相关API 2.2 函数解析 2.2.1 xTaxkCreate() 2.2.2 xTaskCreateStatic() 2.2.3 vTaskDelete() 3、实战案例 3.1 创建两个…

​Inf-DiT:Upsampling Any-Resolution Image、Vidu、MVDiff、Trio-ViT

本文首发于公众号&#xff1a;机器感知 ​Inf-DiT&#xff1a;Upsampling Any-Resolution Image、Vidu、MVDiff、Trio-ViT Inf-DiT: Upsampling Any-Resolution Image with Memory-Efficient Diffusion Transformer Diffusion models have shown remarkable performance in im…

C++:STL-string

前言 本文主要介绍STL六大组件中的容器之一&#xff1a;string&#xff0c;在学习C的过程中&#xff0c;我们要将C视为一个语言联邦&#xff08;摘录于Effective C条款一&#xff09;。如何理解这句话呢&#xff0c;我们学习C&#xff0c;可将其分为四个板块&#xff1b;分别为…

基于springboot实现医院药品管理系统项目【项目源码+论文说明】

基于springboot实现医院药品管理系统演示 摘要 身处网络时代&#xff0c;随着网络系统体系发展的不断成熟和完善&#xff0c;人们的生活也随之发生了很大的变化&#xff0c;人们在追求较高物质生活的同时&#xff0c;也在想着如何使自身的精神内涵得到提升&#xff0c;而读书就…

python-类和对象

1、设计一个 Circle类来表示圆,这个类包含圆的半径以及求面积和周长的函数。再使用这个类创建半径为1~10的圆,并计算出相应的面积和周长。 &#xff08;1&#xff09;源代码&#xff1a; import math class Circle: def __init__(self, r): self.r r #面积 def area(self): r…

嵌入式开发九:STM32时钟系统

时钟对于单片机来说是非常重要的&#xff0c;它为单片机工作提供一个稳定的机器周期从而使系统能够正常运行。时钟系统犹如人的心脏&#xff0c;一旦有问题整个系统就崩溃。我们知道 STM32 属于高级单片机&#xff0c;其内部有很多的外设&#xff0c;但不是所有外设都使用同一时…

IO 5.9号

创建一对父子进程&#xff1a; 父进程负责向文件中写入 长方形的长和宽 子进程负责读取文件中的长宽信息后&#xff0c;计算长方形的面积 #include <myhead.h>int main(int argc, const char *argv[]){int retvalfork();if(retval>0){float length,width;int wfdopen(…

【二维数组】

目录 作业 对比&#xff1a; 结果&#xff1a; 二维数组 二维数组的初始化 作业 作业 #define max(a,b)(a>b)?a:b #include<stdio.h> int main() {int x, y,c;scanf("%d %d", &x,&y);cmax(x, y);printf("%d", c);return 0; } 对比…

关于模型参数融合的思考

模型参数融合通常指的是在训练过程中或训练完成后将不同模型的参数以某种方式结合起来&#xff0c;以期望得到更好的性能。这种融合可以在不同的层面上进行&#xff0c;例如在神经网络的不同层之间&#xff0c;或者是在完全不同的模型之间。模型参数融合的目的是结合不同模型的…

震惊,现在面试都加科技与狠货了

震惊&#xff0c;现在面试都加科技与狠货了 生成式AI盛行的现在&#xff0c;程序员找工作变容易了吗我和老痒喝着大酒&#xff0c;吃着他的高升宴&#xff0c;听他说他面试的各种细节&#xff0c;老狗我只恨自己动作慢了一步&#xff0c;不然现在在那侃侃而谈的就是我了。 面试…