波奇学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,子进程将不产生僵尸进程

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

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

相关文章

超市小程序有哪些功能 怎么制作

超市小程序是非常有用的工具&#xff0c;可以帮助超市提升用户体验&#xff0c;提高销售额。下面我们来看一下超市小程序可以具备哪些功能&#xff0c;以及如何制作一个高效的超市小程序。 1. **商品展示与搜索功能**&#xff1a;用户可以浏览超市的商品信息&#xff0c;包括价…

数字化转型导师坚鹏:大模型的应用实践(金融)

大模型的应用实践 ——开启人类AI新纪元 打造数字化转型新利器 课程背景&#xff1a; 很多企业和员工存在以下问题&#xff1a; 不清楚大模型对我们有什么影响&#xff1f; 不知道大模型的发展现状及作用&#xff1f; 不知道大模型的针对性应用案例&#xff1f; 课程…

雍禾医疗耀眼的“小”医生,雍禾植发刘树伟10年热爱一份事业

“你说你一个普外科大大夫&#xff0c;怎么改去做小小毛发医生了呢&#xff1f;”这是雍禾植发刘树伟医生&#xff0c;从公立医院转行做毛发医生时&#xff0c;被人质疑最多的点。然而&#xff0c;选择成为一名毛发医生&#xff0c;却是他花3年时间做出的重要的决定。 2009年&…

【C++ STL详解】——string类

目录 前言 一、string类对象的常见构造 二、string类对象的访问及遍历 1.下标【】&#xff08;底层operator【】函数&#xff09; ​编辑 2.迭代器 3.范围for 4.at 5.back和front 三、string类对象的容量操作 1.size 和 length 2.capacity 3.empty 4.clear 5.res…

【校园安全】支小蜜防校园霸凌语音识别系统的好处

在校园安全领域&#xff0c;防校园霸凌语音识别系统的出现&#xff0c;为预防和应对校园霸凌行为提供了新的技术手段。本文将探讨防校园霸凌语音识别系统的好处&#xff0c;并分析其在校园安全建设中的重要作用。 通过安装在校园各个角落的语音识别设备&#xff0c;系统能够捕…

Flink并行度

1、Task flink中每个算子就是一个Task&#xff0c;比如flatMap、map、sum是一个Task。 2、SubTask 算子有几个并行度SubTask的数量就是几&#xff0c;比如 3、算子并行度 算子并行度指的是每个算子的并行度&#xff0c;可用env.setParallelism(1);设置所有算子的并行度&am…

浏览器是如何渲染页面的?

浏览器是如何渲染页面的&#xff1f; 1. 解析 HTML2. 样式计算 Computed Style3. 布局 Layout4. 分层 Layer5. 绘制 Paint6. 分块 Tiling7. 光栅化 Raster8. 画 draw完整过程面试题什么是 reflow&#xff08;回流/重排&#xff09;?什么是 repaint &#xff08;重绘&#xff0…

智慧城市中的数字孪生:构建城市管理的未来框架

目录 一、引言 二、数字孪生技术概述 三、数字孪生技术在智慧城市中的应用 1、实时监测与预警 2、模拟与优化 3、智能化决策 4、协同与共享 四、数字孪生技术构建城市管理的未来框架的价值 1、提高管理效率 2、优化资源配置 3、提升公共服务水平 4、增强应对突发事…

【Linux】Linux——Centos7安装

目录 虚拟机安装【空壳子】安装VMware Workstation新建虚拟机硬件兼容性(直接下一步)稍后安装操作系统客户及操作系统选择Linux&#xff0c;版本Centos764位给虚拟机命名&#xff0c;并选择安装位置处理器配置&#xff08;默认即可&#xff0c;不够用后面可以调&#xff09;虚拟…

JavaWeb - 3 - JavaScript(JS)

JavaScript(JS)官方参考文档&#xff1a;JavaScript 教程 JavaScript&#xff08;简称&#xff1a;JS&#xff09;是一门跨平台、面向对象的脚本语言&#xff0c;是用来控制网页行为的&#xff0c;它能使网页可交互&#xff08;脚本语言就不需要编译&#xff0c;直接通过浏览器…

谷歌广告(google Ads)投放技巧

Google广告投放涉及多个方面&#xff0c;以下是一些常用的技巧&#xff0c;可以帮助提高广告效果&#xff1a; 关键词选择&#xff1a; 选择与你的产品或服务紧密相关的关键词&#xff0c;并确保这些关键词与用户的搜索意图匹配。使用Google关键词规划工具来找到潜在的关键词&a…

python词嵌入

一、词嵌入的概念 自然语言处理的突破在2023年震撼世界&#xff0c;chatgpt3出来&#xff0c;之后chatgpt4、Gemini、Claude3等出来&#xff0c;问答越来越智能&#xff0c;非常厉害&#xff0c;其中有个基础性的概念&#xff0c;计算机要如何理解语言&#xff0c;基础工作就在…

IOS苹果通话记录在线生成网站源代码,直接上传就可使用

一键生成&#xff0c;PHP的上传到网站根目录打开域名访问即可 源码免费下载地址专业知识分享社区-专业知识笔记免费分享 (chaobiji.cn)

个人开发者如何制作实用的微信预约小程序?

随着移动互联网的普及&#xff0c;微信小程序已经成为一种非常流行的应用方式。在本文中&#xff0c;我们将介绍如何通过乔拓云平台制作一个微信预约小程序&#xff0c;从入门到精通&#xff0c;让你轻松完成这个过程。 一、注册登录乔拓云平台 首先&#xff0c;你需要在乔拓云…

为什么说鸿蒙开发就业面广?人才遭“爆抢”的背后说明什么?

鸿蒙开发&#xff0c;作为华为推出的全新操作系统&#xff0c;自其诞生以来就备受关注。而鸿蒙开发就业面广&#xff0c;人才遭“爆抢”的现象&#xff0c;更是引发了业界的广泛讨论。那么&#xff0c;这一现象背后究竟隐藏着怎样的原因和深意呢&#xff1f; 首先&#xff0c;鸿…

Vue.js 进阶技巧:keep-alive 缓存组件解析

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…

Java数组常用操作

创建数组 int[] a {1,2,3};int[] a new int[]{1,2,3};int[] a new int[3];ArrayList<Integer> arr new ArrayList<>(); 添加元素 arr.add(99); //将99加入到数组末尾arr.add(3,99); //将99加入到指定索引3处访问元素 int c1 c[1]; int arr1 arr.get(1); …

链表习题-力扣oj (附加思路版)

LCR 140. 训练计划 IIhttps://leetcode.cn/problems/lian-biao-zhong-dao-shu-di-kge-jie-dian-lcof/ 给定一个头节点为 head 的链表用于记录一系列核心肌群训练项目编号&#xff0c;请查找并返回倒数第 cnt 个训练项目编号。 思路&#xff1a;双指针&#xff0c;快指针先走cnt…

Java中的优先队列PriorityQueue如何排序

目录 一、基本数据类型的排序 &#xff08;1&#xff09;升序 &#xff08;2&#xff09;降序 二、自定义类型如何排序 &#xff08;1&#xff09;升序 &#xff08;2&#xff09;降序 既然大家想要了解优先队列的排序&#xff0c;那么说明已经知道什么事优先队列了&…

ROS 2基础概念#6:服务(Service)| ROS 2学习笔记

服务&#xff08;Service&#xff09;是 ROS 2 计算图中节点通信的另一种方法。 服务基于调用和响应模型&#xff0c;而不是主题的发布者-订阅者模型。 虽然主题允许节点订阅数据流并获取持续更新&#xff0c;但服务仅在客户端专门调用时才提供数据。 ROS 2服务的基本概念 ROS…