波奇学Linux: 信号捕捉

sigaction:修改信号对应的handler方法

act输入型参数,oldact输出型参数

void (*sa_handler) (int) //修改的自定义函数

sigset_t sa_mask // 

void handler(int signo)
{cout<<"catch a signal, signal number: "<<signo<<endl;
}
int main()
{// 创建结构体变量struct sigaction act,oact;//清空memset(&act,0,sizeof(act));memset(&oact,0,sizeof(oact));//设置自定义方法act.sa_handler=handler;sigaction(2,&act,&oact);while(true){cout<<" I am a process: "<<getpid()<<endl;sleep(1);}return 0;}

信号递达时,pending位图什么时候变成0的,是在调用函数前还是调用函数后

void PrintPending()
{sigset_t set;//获得pending位图sigpending(&set);for(int signo=1;signo<=31;signo++){if(sigismember(&set,signo)) cout<<"1";else cout<<" 0 ";}cout<<"\n";
}
void handler(int signo)
{PrintPending();cout<<"catch a signal, signal number: "<<signo<<endl;
}

在执行信号捕捉方法之前先清零再调用

当某个信号的处理函数被调用时,内核自动将当前信号加入进程的信号屏蔽字,当信号处理函数返回时,才恢复原来的信号屏蔽。通俗点就是调用处理函数时,block表的值为1,屏蔽相同信号的递达。

void handler(int signo)
{cout<<"function start";//一直在调用自定义函数while(true){//PrintPending();cout<<"catch a signal, signal number: "<<signo<<endl;}
}

没有function start只打印了一次

sigset_t 信号屏蔽:调用自定义函数时同时屏蔽其他信号

//初始化
sigemptyset(&act.sa_mask);
//屏蔽信号1,2,3,4
sigemptyset(&act.sa_mask,1);
sigemptyset(&act.sa_mask,2);
sigemptyset(&act.sa_mask,3);
sigemptyset(&act.sa_mask,4);

可重入函数的问题

main执行流进入某个函数时,接收到信号调用同一个函数,此时函数被进入了两次。

当insert的函数时执行到head=p时,又调用了sighandler函数p->next=head代码。

当执行完新调用的代码后才会执行head=p。

可能导致内存泄漏问题

如果一个函数被重复进入出错了,或者可能出错,不可重入函数,否则叫可重入函数。main函数和signal hander函数也有自己的栈帧。

volatile 关键字:保证从内存而不是从寄存器中获取变量

int flag=0;
void handler(int signo)
{cout<<"catch a signal: "<<signo<<endl;flag=1;
}
int main()
{signal(2,handler);while(!flag);cout<<"process quit normal"<<endl;return 0;
}

尽管调用了handler函数,但是程序依然死循环

main和handler是不同的栈帧

cpu扫描main栈帧发现flag没有被修改,直接放在寄存器中,且从寄存器中读取,不再每次从内存中读取。

读取变量到寄存器,进行逻辑检测

而hander执行流只能修改内存中的flag值,而cpu不会从内存中读取。

volatile int flag=0 // 防止编译器过渡优化,保存内存可见性!

基于信号捕捉来进行进程回收

子进程在退出的时候,会主动向父进程发送信号17

子进程在进行等待的时候,我们可以采用基于信号的方式等待 

进程等待的好处:

获取子进程的退出状态,释放子进程僵尸态

虽然不知道父子谁运行,但是父进程一定是最后退出的

void handler(int signo)
{pid_t rid=waitpid(-1,nullptr,0); //接收17信号,回收进程cout<<"I am process: "<<getpid()<<"catch a signo: "<<signo<<endl;
}
int main()
{signal(17,handler);pid_t id=fork();if(id==0){while(true){cout<<"I am child process: "<<getpid()<<" , ppid: "<<getppid()<<endl;sleep(1);break;}exit(0);}while(true){cout<<" I am father process: "<<getpid()<<endl;sleep(1);}
}

当有多个子进程利用信号回收

void handler(int signo)
{sleep(5);pid_t rid;// rid的值为0 说明进程全部回收,rid的值大于0为回收进程的pid// 轮询回收,防止被某个进程回收卡住while((rid==waitpid(-1,nullptr,WNOHANG))>0){cout<<"I am process: "<<getpid()<<"catch a signo: "<<signo<<endl;}
}

不产生僵尸进程,将sigaction将SIGCHLD的处理动作设置为SIG_IGN或者将signal(17,SIG_IGN)

显性忽略信号17,子进程将不产生僵尸进程

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

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

相关文章

WindTerm的安装及远程连接Linux系统步骤

文章目录 WindTerm下载WindTerm远程连接Linux WindTerm下载 官网下载链接 WindTerm网盘下载链接 WindTerm不需要安装&#xff0c;将下载的压缩包解压后直接找到WindTerm.exe执行文件&#xff0c;双击即可运行 WindTerm远程连接Linux 1.先获取你的Linux的IP地址&#xff0c;…

【高效开发工具系列】Windows 系统下将 Windows 键盘的 ctrl 和 alt 互换

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

Mysql深入学习 基础篇 Ss.06 事务

青青子衿&#xff0c;悠悠我心 纵我不往&#xff0c;子宁不嗣音 —— 24.3.9 事务&#xff1a; 事务简介 事务操作 事务四大特性 并发事务问题 事务隔离级别 一、事务简介 事务是一组操作的集合&#xff0c;它是一个不可分割的工作单位&#xff0c;事务会把所有的操作作为一个整…

【蓝桥杯-单片机】LED和按键小练习:Led彩灯控制系统

文章目录 【蓝桥杯-单片机】LED和按键小练习&#xff1a;Led彩灯控制系统01 题目描述02 题目解答03 本题总结整体逻辑框架&#xff08;详细版&#xff09;整体逻辑框架&#xff08;缩略版&#xff09;按键读取模块按键消抖模块流水灯显示模式&#xff08;1&#xff09;从上向下…

基于SVM模型的网络入侵检测模型训练与评估(NSL-KDD数据集)

简介 针对网络安全领域的NSL-KDD数据集进行分类任务的预处理和模型训练、以及超参数调优。 数据预处理 读取并解析数据集&#xff1b;检查并删除指定列&#xff08;outcome&#xff09;的缺失值&#xff1b;对类别型特征&#xff08;protocol_type, service, flag&#xff0…

GPT-4 等大语言模型(LLM)如何彻底改变客户服务

GPT-4革命&#xff1a;如何用AI技术重新定义SEO策略 在当今快节奏的数字时代&#xff0c;客户服务不再局限于传统的电话线或电子邮件支持。 得益于人工智能 (AI) 和自然语言模型 (NLM)&#xff08;例如 GPT-4&#xff09;的进步&#xff0c;客户服务正在经历革命性的转变。 在这…

【Python】成功解决NameError: name ‘a‘ is not defined

【Python】成功解决NameError: name ‘a’ is not defined &#x1f308; 个人主页&#xff1a;高斯小哥 &#x1f525; 高质量专栏&#xff1a;Matplotlib之旅&#xff1a;零基础精通数据可视化、Python基础【高质量合集】、PyTorch零基础入门教程&#x1f448; 希望得到您的订…

gensim 实现 TF-IDF;textRank 关键词提取

目录 TF-IDF 提取关键词 介绍 代码 textRAnk 提取关键词 这里只写了两种简单的提取方法&#xff0c;不需要理解上下文&#xff0c;如果需要基于一些语义提取关键词用 LDA&#xff1a;TF-IDF&#xff0c;textRank&#xff0c;LSI_LDA 关键词提取-CSDN博客 TF-IDF 提取关键词…

MySQL中批量修改某个字段的一部分字符,可以使用UPDATE语句结合REPLACE函数

示例语句 UPDATE your_table_name SET your_column_name REPLACE(your_column_name, old_string, new_string) WHERE your_column_name LIKE %old_string%; 原因&#xff1a; 项目用了一个服务上传地址原来是http开头&#xff0c;数据库存的地址也是http&#xff0c;后来加了…

基于java EE医疗机械设备采购管理系统设计与实现

目 录 摘 要 I Abstract II 引 言 1 1 系统开发相关技术 3 1.1 J2EE技术简介 3 1.2 SSH框架技术 3 1.3 JQuery技术 3 1.4 CSS技术 3 1.5 XML技术 3 1.6 Ajax技术 4 1.7 MySQL数据库 4 1.8 本章小结 4 2 系统分析 5 2.1 概要分析 5 2.2 功能需求分析 6 2.3 功能初步设计 6 2.4 …

COMSOL热应力仿真

热应力 热膨胀子节点 热膨胀输入类型 假如直接知道热膨胀大小&#xff0c;可以直接对热应变进行赋值。 约束与载荷 对于自由膨胀&#xff0c;可以添加抑制刚体运动。 案例分析 在参数部分&#xff0c;设定体积参考温度Tref&#xff0c;假定在25[degC]模型无热应变。 APP开发器-…

vue 使用 PrintJs 实现打印pdf效果

一、print.js介绍 Print.js主要是为了帮助我们直接在应用程序中打印PDF文件&#xff0c;而无需离开界面&#xff0c;并且不使用嵌入。对于用户不需要打开或下载PDF文件的特殊情况&#xff0c;他们只需要打印它们。 例如&#xff0c;当用户请求打印在服务器端生成的报告时&…

IRLINK(红外遥控器)

工具 1.Proteus 8 仿真器 2.keil 5 编辑器 原理图 讲解 简介 红外遥控&#xff1a;是利用红外线进行通信的设备&#xff0c;由红外LED调制后的信号发出&#xff0c;由专用的红外接头进行解调&#xff1b; 通信方式&#xff1a;单工、异步&#xff1b; 红外LED波长&#x…

【微信小程序】传参存储

目录 一、本地数据存储 wx.setStorage wx.setStorageSync 1.1、异步缓存 存取数据 1.2、同步缓存 存取数据 二、使用url跳转路径携带参数 2.1、 wx.redirectTo({}) 2.2、 wx.navigateTo({}) 2.3、 wx.switchTab({}) 2.4 、wx.reLaunch({}) 2.5、组件跳转 三、…

docker拉取镜像失败的解决方案大全

更换国内源 创建或修改 /etc/docker/daemon.json 文件&#xff0c;修改&#xff1a; {"registry-mirrors" : ["https://registry.docker-cn.com","http://hub-mirror.c.163.com","https://docker.mirrors.ustc.edu.cn","https:…

Web APIs 5 Window对象、本地存储

Web APIs 5 一、Window对象1、BOM2、定时器-延时函数3、JS执行机制4、location对象案例&#xff1a;5秒钟之后跳转的页面 5、navigator对象6、histroy对象 二、本地存储本地存储 localStorage本地存储 sessionStorage存储复杂数据类型案例&#xff1a;学生就业统计表字符串拼接…

html css 导航栏 2

鼠标划过会向上移动改变颜色 html文件 <!DOCTYPE html> <html><head><meta charset"UTF-8"><title>导航栏</title><link rel"stylesheet" href"css/dhl1.css" /></head><body><div …

动态规划(带你了解 原理 实践)

目录 引言 一、动态规划的基本概念 二、动态规划的应用 1. 背包问题 2. 最短路径问题 3. 0-1背包问题的变种 4. 字符串匹配与编辑距离 5. 金融投资组合优化 6. 生产调度问题 7. 项目管理中的资源分配 三、动态规划算法的优缺点 优点 1 效率高 2 通用性强 缺点&a…

Java高频面试之消息队列与分布式篇

有需要互关的小伙伴,关注一下,有关必回关,争取今年认证早日拿到博客专家 消息队列的基本作用&#xff1f; 异步通信&#xff1a;消息队列提供了异步通信的能力&#xff0c;发送方可以将消息发送到队列中&#xff0c;而无需等待接收方立即处理。发送方和接收方可以解耦&#x…

排序——希尔排序、插入排序

本节复习排序中的希尔排序&#xff0c;希尔排序属于插入排序。 希尔排序的代码和插入排序非常类似。 思想却相对于插入排序来说复杂。 在复习希尔排序之前&#xff0c; 我们需要先复习一下插入排序。 目录 插入排序 插入过程 代码实现 希尔排序 希尔排序的思想 代码实…