捕捉信号的处理

news2025/3/10 15:17:21

文章目录

  • 信号捕捉


信号捕捉

信号捕捉是进程从内核态返回用户态时会对信号进行检测处理。
在这里插入图片描述
如果信号的处理动作是用户自定义函数,在信号递达时就调用这个函数,这称为捕捉信号。由于信号处理函数的代码是在用户空间的,处理过程比较复杂,举例如下: 用户程序注册了SIGQUIT信号的处理函数sighandler。 当前正在执行main函数,这时发生中断或异常切换到内核态。 在中断处理完毕后要返回用户态的main函数之前检查到有信号SIGQUIT递达。 内核决定返回用户态后不是恢复main函数的上下文继续执行,而是执行sighandler函 数,sighandler和main函数使用不同的堆栈空间,它们之间不存在调用和被调用的关系,是 两个独立的控制流程。 sighandler函数返回后自动执行特殊的系统调用sigreturn再次进入内核态。 如果没有新的信号要递达,这次再返回用户态就是恢复main函数的上下文继续执行了。

捕捉信号用sigaction和signal函数进行对信号进行捕捉处理,而在调用捕捉之后进程pending位图对应比特位编号会由1变为0,它是说明时候由1变为0,是在信号捕捉之前
在这里插入图片描述
sigaction可以检测和处理与指定信号相关联的动作。调用成功则返回0,出错则返回- 1。参数signo是指定信号的编号。而act和oldact是结构体类型指针,是一种结构体,若act指针非空,则根据act修改该信号的处理动作,输入型参数。若oact指针非空,则通过oact传
出该信号原来的处理动作,输出型参数。act和oact指向sigaction结构体:
在这里插入图片描述
在这里插入图片描述

结构体中包含对信号的处理方法,以及对信号的屏蔽设置。
将sa_handler赋值为常数SIG_IGN传给sigaction表示忽略信号,赋值为常数SIG_DFL表示执行系统默认动
作,赋值为一个函数指针表示用自定义函数捕捉信号,或者说向内核注册了一个信号处理函 数,该函数返回
值为void,可以带一个int参数,通过参数可以得知当前信号的编号,这样就可以用同一个函数处理多种信
号。显然,这也是一个回调函数,不是被main函数调用,而是被系统所调用。sa_handler为处理对应信号的处理动作。
sa_mask是对信号集做屏蔽的字段就对应进程内核中的block表。
运行一个进程然后让他对2号信号进行捕捉

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

using namespace std;


void PrintPending()
{
    sigset_t set;
    sigpending(&set);

    for (int signo = 1; signo <= 31; signo++)
    {
        if (sigismember(&set, signo))
            cout << "1";
        else
            cout << "0";
    }
    cout << "\n";
}

void handler(int signo)
{
    cout << "catch a signal, signal number : " << signo << endl;
    while (true)
    {
        PrintPending();
        sleep(1);
    }
}

int main()
{
    //先定义两个结构体对象
     struct sigaction act, oact;
     //对两个结构体对象做清零初始化
    memset(&act, 0, sizeof(act));
    memset(&oact, 0, sizeof(oact));

    //然后对信号集做初始化,sa_mask是信号集和中的block信号集
    sigemptyset(&act.sa_mask);
    act.sa_handler = handler; // SIG_IGN SIG_DFL,一般是默认但是在这里设置为了自定义方法

    sigaction(2, &act, &oact);//对2号信号进行捕捉,然后执行对象中方法act是输入型参数,oact为输出型参数

    while (true)
    {
        cout << "I am a process: " << getpid() << endl;
        sleep(1);
    }

    return 0;
}

在这里插入图片描述
对信号处理并且要将为位图上对应信号编号位比特位由1清零,捕捉时获取pending位图,通过实验发现由1清零这个动作是在捕捉之前对pending进行清零操作。并且此时处于信号捕捉状态若是操作系统再对进程发送信号,那么这个进程会不会再陷入这个捕捉信号处理动作中?不会,操作系统不能让一个进程对于一个信号一直处于捕捉状态,防止信号不断递达,进程会自动屏蔽这个信号,就是通过sa_mask实现,它会自动将当前捕捉的这个信号添加到进程block表中,然后当进程再次收到同样的信号时,只会在pending中保存而不会被递达,让这个信号阻塞!
在这里插入图片描述
对于当前信号屏蔽是内核自动做的,因为他不会目睹你一直在调度这个捕捉函数,而当执行完捕捉函数时,返回会自动将这个屏蔽信号解除屏蔽。所以也能得出信号在处理时不能重复调用。正在处理2号信号2号信号会防止重复捕捉,若是我在处理2号信号时,想让进程对其他信号进行屏蔽,当其他信号到来时对其他信号屏蔽,就可以将想要屏蔽的信号添加到sa_mask中,就可以在处理当前信号时让进程对其他信号做屏蔽
对1、3、4号信号做屏蔽,然后再向进程发送这几个信号时,不会处理对应信号动作,而是对其进行屏蔽,然后在pending位图中保存起来
在这里插入图片描述

当某个信号的处理函数被调用时,内核自动将当前信号加入进程的信号屏蔽字,当信号处理函数返回时自动恢复原来的信号屏蔽字,这样就保证了在处理某个信号时,如果这种信号再次产生,那么 它会被阻塞到当前处理结束为止。 如果在调用信号处理函数时,除了当前信号被自动屏蔽之外,还希望自动屏蔽另外一些信号,则用sa_mask字段说明这些需要额外屏蔽的信号,当信号处理函数返回时自动恢复原来的信号屏蔽字。 对信号的捕捉可以使其对其他信号不做出响应。

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

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

相关文章

linux——cron定时任务

cron定时任务配置文件中可以查看一些信息 crontab就是在提交以及管理需要周期性执行的任务 定时任务具体实现需要使用crontab命令编辑对应定时任务文件 这里执行定时任务&#xff0c;每分钟创建一个文件1.txt

jvm中的垃圾回收器

Jvm中的垃圾回收器 在jvm中&#xff0c;实现了多种垃圾收集器&#xff0c; 包括&#xff1a; 1.串行垃圾收集器 2.并行垃圾收集器 3.CMS&#xff08;并发&#xff09;垃圾收集器 4.G1垃圾收集器 1.串行垃圾回收器 效率低&#xff0c;使用较少 2.并行垃圾回收器 3.并发垃圾回…

mysql download 2024

好久没在官网下载 mysql server 安装包。今天想下载发现&#xff1a; 我访问mysql官网的速度好慢啊。mysql server 的下载页面在哪里啊&#xff0c;一下两下找不到。 最后&#xff0c;慢慢悠悠终于找到了下载页面&#xff0c;如下&#xff1a; https://dev.mysql.com/downlo…

3 命名实体识别调优化

能走到这里说明你对模型微调有了一个基本的认识。那么开始一段命名实体的任务过程&#xff0c;下面使用huggingface官网的数据。 1 准备模型 下面的模型自己选择一个吧&#xff0c;我的内存太第一个模型跑不了。 https://huggingface.co/ckiplab/bert-base-chinese-ner/tree…

医学访问学者专栏—研究领域及工作内容

在国外访问学者申请中&#xff0c;医学领域的研究、教学及从业人员占有相当大的比例&#xff0c;这些医学访问学者的研究领域及工作内容都有哪些&#xff1f;本文知识人网小编就相关问题进行详细阐述&#xff0c;并附带案例说明。 一、在国外做医学访问学者可以从事哪些工作&am…

Win10 打开有些软件主界面会白屏不显示,其他软件都正常

环境&#xff1a; Win10专业版 英伟达4070 显卡 问题描述&#xff1a; Win10 打开有些软件主界面会白屏不显示,打开远程协助软件AIRMdesk,白色&#xff0c;其他软件都正常 解决方案&#xff1a; 网上说电脑没有接显示器独立显卡的关系导致 我是只有一台主机&#xff0c;没…

appium相关的知识

>adb shell dumpsys window | findstr mCurrentFocus adb devices # 实例化字典 desired_caps = dict() desired_caps[platformName] = Android desired_caps[platformVersion] = 9 # devices desired_caps[deviceName] = emulator-5554 # 包名 desired_caps[appPackage] …

DRF 查询(排序、过滤、分页)

查询(排序、过滤、分页) 【0】准备 &#xff08;1&#xff09;Q查询 详细内容可见&#xff1a;Django模型层-CSDN博客Django 的 Q 对象提供了一种在数据库查询中构造复杂查询的方法。当你想在单个查询中组合多个过滤条件&#xff0c;并且这些条件之间不仅仅是简单的 AND 关系…

MySQL8.0.36-社区版:二进制日志(4)

什么是二进制日志&#xff08;binlog&#xff09;&#xff1a;记录了所有的ddl和dml语句&#xff0c;但是不包括查询类的 二进制日志的作用&#xff1a;1.灾难恢复&#xff0c;2.mysql主从复制 查看二进制日志状态 show variables like %log_bin%; 在mysql8中默认是开启的 | l…

TLV61048非同步升压BOOST转换器输入电压2.6-5.5V输出电流4A输出电压最高15V

推荐原因&#xff1a; 输入电压较低&#xff0c;输出电流可达3.5A SOT23-6封装 批量价格约0.70元 TLV61048引脚 TLV61048引脚功能 7 详细说明 7.1 概述 TLV61048是一款非同步升压转换器&#xff0c;支持高达 15 V 的输出电压和输入范围从 2.61 V 到 5.5 V。该TLV61048集成了…

C++ map和set的应用

1. 关联式容器 我们已经接触过STL中的部分容器&#xff0c;比如&#xff1a;vector、list、deque、 forward_list(C11)等&#xff0c;这些容器统称为序列式容器&#xff0c;因为其底层为线性序列的数据结构&#xff0c;里面存储的是元素本身。那什么是关联式容器&#xff1f;它…

如何用Java语言实现远程控制多路照明

如何用Java语言实现远程控制多路照明呢&#xff1f; 本文描述了使用Java语言调用HTTP接口&#xff0c;实现控制多路照明。通过多路控制器&#xff0c;可独立远程控制多路照明。 可选用产品&#xff1a;可根据实际场景需求&#xff0c;选择对应的规格 序号设备名称1智能WiFi控…

hcia datacom课程学习(7):直连路由、静态路由

直连路由路由器接口上的网络&#xff08;接口配置了IP地址并且开启&#xff09;静态路由管理员手工添加的网络动态路由路由器之间动态学习形成的网络 1.直连路由 每当给路由器的一个接口配置了ip&#xff0c;路由表中就会产生对应的直连路由 配置路由接口ip的命令&#xff1…

编辑个人百度百科词条的小窍门,让你一次通过!

个人百度百科词条展示的是个人专业素养和成就&#xff0c;能够提升个人品牌形象&#xff0c;增加社交圈子中的竞争力。个人百度百科词条编辑攻略&#xff1a;如何通过审核&#xff1f;大家好&#xff01;今天伯乐网络传媒来分享一个超实用的经验——如何编辑个人百度百科词条才…

VM安装openwrt

openwrt是什么 OPENWRT是一种嵌入式操作系统&#xff0c;旨在取代原始路由器 固件 &#xff0c;并提供更多功能和自定义选项。 它构建在Linux内核之上&#xff0c;并由一系列 软件 包组成&#xff0c;以满足各种网络需求。 下载 官网下载地址&#xff1a;Index of /releases…

力扣-2259移除指定数字得到的最大结果

思路&#xff1a; 1. def removeDigit(self, number: str, digit: str) -> str:&#xff1a;这是一个类方法&#xff0c;接受两个参数 number 和 digit&#xff0c;分别表示输入的数字字符串和要移除的数字字符&#xff0c;返回一个字符串。 2. n len(number)&#xff1a…

内网穿透工具(zerotier, tailscale)

内网穿透工具 zerotier tailscale 一、Zerotier1. Zerotier 网页注册2. Zerotier 网页使用(1) Zerotier 网页配置 3. Zeritier 终端配置(1) Zeritier 终端下载(2) Zeritier 终端连接 二、Tailscale1. 进入主页2. Tailscale 网页注册登录3. Tailscale 网页添加设备4. Tailscale …

解决方案 SHUTDOWN_STATE xmlrpclib.py line: 794 ERROR: supervisor shutting down

Supervisor操作命令 重新加载 Supervisor 配置&#xff1a; sudo supervisorctl reread sudo supervisorctl update sudo supervisorctl restart all这将重新读取 Supervisor 的配置文件&#xff0c;更新进程组&#xff0c;然后重启所有进程。 查看 Supervisor 日志&#xff1…

【系统架构师】-选择题(一)

1、信息系统规划方法中&#xff0c;关键成功因素法通过对关键成功因素的识别&#xff0c;找出实现目标所需要的关键信息集合&#xff0c;从而确定系统开发的 &#xff08;优先次序&#xff09; 。关键成功因素来源于组织的目标&#xff0c;通过组织的目标分解和关键成功因素识别…

南京林业大学阮宏华团队揭示干旱对杨树人工林土壤微生物残留物碳的影响

全球强度干旱事件的频繁发生&#xff0c;对陆地生态系统土壤有机碳库可能产生显著影响。土壤微生物残体碳是土壤有机碳库的重要组成部分&#xff0c;微生物残体碳的变化对土壤有机碳库产生显著影响。然而&#xff0c;土壤中微生物残体碳对干旱的响应及其机制还不清楚。 基于此…