当前位置: 首页 > news >正文

Linux操作系统5- 补充知识(可重入函数,volatile关键字,SIGCHLD信号)

上篇文章:Linux操作系统5-进程信号3(信号的捕捉流程,信号集,sigaction)-CSDN博客

本篇Gitee仓库:myLerningCode/l26 · 橘子真甜/Linux操作系统与网络编程学习 - 码云 - 开源中国 (gitee.com)

目录

一. 可重入函数

二. volatile关键字

2.1 volatile关键字作用

 2.2 中断程序下volatile关键字作用

三. SIGCHILD 信号

3.1 使用SIGCHLID处理进程退出

3.2 SIG_IGN清理僵尸进程


一. 可重入函数

我们一般将 main函数执行流和 信号捕捉执行流是两个执行流

有一个函数fun:

如果在main执行流和信号捕捉执行流中,这个函数被重复进入,如果出现了问题  -  则这个函数是不可重入函数。

如果在main执行流和信号捕捉执行流中,这个函数被重复进入,如果没有出现问题  -  则这个函数是可重入函数。

        不可重入函数如果在多个执行流中执行的话,可能会导致数据不安全问题

        是否可重入是一个中性的形容词。

一般来说:调用了malloc/free/new/delete等的函数是不可重入的 。调用了 I/O操作的函数也是不可重入的。

二. volatile关键字

2.1 volatile关键字作用

        vlolatile关键字的作用是:保证某变量的内存可见性。

        被vlolatile修饰的变量,系统总是从内存中读取这个数据。此时编译器不会对这个变量过度优化(比如将其写入到某一个寄存器中,从寄存器读取数据)。

 2.2 中断程序下volatile关键字作用

        下面这段代码可能会出现编译器过度优化而导致的错误。

#include <stdio.h>
#include <unistd.h>
#include <signal.h>int quit = 0;void handler(int signo)
{printf("捕捉到[%d]信号\n", signo);printf("quit: %d", quit);quit = 1;printf("-> %d\n", quit);
}int main()
{signal(2, handler);while (!quit);printf("由于信号捕捉, quit为1 正常退出\n");return 0;
}

        该代码收到2号信号就会更改quit,然后进程就能正常结束

不优化情况下编译运行:

可以看到程序没有任何问题。

        现在增加编译器的优化, 修改makefile 增加 -O3

可以看到,ctrl c 之后进程收到2号信号将quit改为1,但是不会退出 。

为什么不会退出呢?数据会保存在内存或者寄存器

不优化:执行handler之后,将quit写回内存,main函数退出

优化:quit在main函数执行流没有被修改,编译器之后将其保存在寄存器中,且之后一直从寄存器中读取数据。执行handler之后,将物理内存中的quit改为1,但是寄存器中的数据没有修改,所以进程不会退出。

        这样就导致了代码无问题,程序有问题

如果对quit使用volatile关键字修饰,此时会保证其内存可见性(每次读取数据的时候都去内存中读取数据) 。之后就不会出问题了

#include <stdio.h>
#include <unistd.h>
#include <signal.h>volatile int quit = 0;void handler(int signo)
{printf("捕捉到[%d]信号\n", signo);printf("quit: %d", quit);quit = 1;printf("-> %d\n", quit);
}int main()
{signal(2, handler);while (!quit);printf("由于信号捕捉, quit为1 正常退出\n");return 0;
}

运行结果如下: 

三. SIGCHILD 信号

3.1 使用SIGCHLID处理进程退出

        SIGCHLID(17号)这个信号是子进程退出的时候会向父进程发送这个信号。

        我们在进程控制时候提到,可以使用wait或者waitpid来获取子进程退出的信息。处理僵尸进程(子进程退出,父进程太忙无时间处理子进程退出)问题。

        我们可以采用阻塞或者非阻塞的方式来等待子进程退出。采用阻塞的话,父进程就不能进行自己的工作。采用非阻塞的方式的话,进行自己工作的时候询问也会降低效率。

 进程等待可看这篇文章:Linux操作系统2-进程控制2(进程等待,waitpid系统调用,阻塞与非阻塞等待)_wait系统调用-CSDN博客

        我们使用子进程退出,父进程接收17号信号的特点。17号信号的默认行为是忽略,如果我们自定义17号信号的行为,在handler中进行等待子进程退出,这样就能让父进程去执行自己的代码而不用去浪费时间关心子进程退出了。

        即子进程退出,向父进程发送SIGCHILD信号,父进程接收信号后调用wait/waitpid清理子进程退出信息。清理僵尸进程。

测试代码如下:

        如果有多个子进程同时退出,或者部分子进程退出,需要循环等待它们,并且只要没等待成功就立即结束信号捕捉方法。

代码如下:

#include <iostream>#include <unistd.h>
#include <wait.h>
#include <signal.h>
#include <sys/types.h>void handler(int signo)
{// 处理子进程退出信息std::cout << "我是父进程 pid为:" << getpid() << "收到信号:" << signo << std::endl;while (1){int status = 0;pid_t sid = waitpid(-1, &status, 0);printf("子进程退出码[%d], 子进程退出信号[%d]\n", ((status >> 8) & 0xff), (status & 0x7f));if (sid <= 0)break;}
}int main()
{// 1.自定义SIGCHILD行为signal(SIGCHLD, handler);// 2.创建子进程pid_t id = fork();if (id == 0){// 子进程int cnt = 5;while (cnt--){std::cout << "我是子进程 pid为:" << getpid() << std::endl;sleep(1);}exit(2);}// 父进程int cnt = 0;while (1){std::cout << "我是父进程 pid为:" << getpid() << " 次数为:" << cnt++ << std::endl;sleep(1);}return 0;
}

3.2 SIG_IGN清理僵尸进程

        使用SIG_IGN清理僵尸是由于uinx的历史原因。在linux中保留了这种方式。

        我们使用signal或者sigaction将SIGCHILD信号的捕捉方法设置为SIG_IGN即可自动帮助我们清理僵尸进程。

测试代码如下:

         

#include <iostream>#include <unistd.h>
#include <wait.h>
#include <signal.h>
#include <sys/types.h>int main()
{// 1.自定义SIGCHILD行为,并用SIG_IGN清理僵尸进程signal(SIGCHLD, SIG_IGN);// 2.创建子进程pid_t id = fork();if (id == 0){// 子进程int cnt = 5;while (cnt--){std::cout << "我是子进程 pid为:" << getpid() << std::endl;sleep(1);}exit(2);}// 父进程不等待子进程int cnt = 0;while (1){sleep(1);}return 0;
}

测试僵尸进程有没有被处理。

 

如果我们注释掉 signal(SIGCHLD, SIG_IGN); 这条代码。

运行结果如下:

子进程没有受到处理变为僵尸进程,导致内存泄漏 

相关文章:

Linux操作系统5- 补充知识(可重入函数,volatile关键字,SIGCHLD信号)

上篇文章&#xff1a;Linux操作系统5-进程信号3&#xff08;信号的捕捉流程&#xff0c;信号集&#xff0c;sigaction&#xff09;-CSDN博客 本篇Gitee仓库&#xff1a;myLerningCode/l26 橘子真甜/Linux操作系统与网络编程学习 - 码云 - 开源中国 (gitee.com) 目录 一. 可重入…...

ctfshow刷题笔记—栈溢出—pwn61~pwn64

目录 前言 一、pwn61&#xff08;输出了什么&#xff1f;&#xff09; 二、pwn62&#xff08;短了一点&#xff09; 三、pwn63(又短了一点) 四、pwn64(有时候开启某种保护并不代表这条路不通) 五、一些shellcode 前言 这几道都是与shellcode有关的题&#xff0c;实在是…...

java23种设计模式-责任链模式

责任链模式(Chain of Responsibility Pattern)学习笔记 编程相关书籍分享:https://blog.csdn.net/weixin_47763579/article/details/145855793 DeepSeek使用技巧pdf资料分享:https://blog.csdn.net/weixin_47763579/article/details/145884039 🌟 模式定义 责任链模式是…...

新一代跨境电商ERP系统:从订单到发货的全流程自动化管理

随着全球电商市场的持续扩张&#xff0c;跨境电商卖家面临着多平台运营、国际物流、税务合规等复杂挑战。如何高效整合订单、库存、物流和财务数据&#xff0c;实现从客户下单到商品交付的无缝衔接&#xff0c;成为企业降本增效的关键。Zoho Books作为一款专为跨境商家设计的智…...

苹果廉价机型 iPhone 16e 影像系统深度解析

【人像拍摄差异】 尽管iPhone 16e支持后期焦点调整功能&#xff0c;但用户无法像iPhone 16系列那样通过点击屏幕实时切换拍摄主体。前置摄像头同样缺失人像深度控制功能&#xff0c;不过TrueTone原彩闪光灯系统在前后摄均有保留。 很多人都高估了 iPhone 的安全性&#xff0c;查…...

hive 面试题

Hive基础概念 1.1 Hive是什么&#xff1f; 基于Hadoop的数据仓库工具&#xff0c;支持类SQL&#xff08;HiveQL&#xff09;查询&#xff0c;底层转换为MapReduce/Tez/Spark任务。 核心功能&#xff1a;数据ETL、查询、分析&#xff1b;定位&#xff1a;OLAP&#xff08;分析…...

VScode在windows10上使用clang-format

用途&#xff1a;自动调整代码格式&#xff0c;如缩进等。 clang-format官方文档&#xff1a;ClangFormat — Clang 21.0.0git documentation 前提&#xff1a;有一个.clang-format文件 下载LLVM&#xff1a;https://github.com/llvm/llvm-project/releases&#xff0c;将可…...

AWS API Gateway灰度验证实现

在微服务架构中,灰度发布(金丝雀发布)是验证新版本稳定性的核心手段。通过将小部分流量(如 10%)导向新版本服务,可以在不影响整体系统的情况下快速发现问题。AWS API Gateway 原生支持流量按比例分配功能,无需复杂编码即可实现灰度验证。本文将详细解析其实现方法、最佳…...

【每日八股】MySQL篇(三):索引(上)

目录 MySQL 为什么使用 B 树来做索引&#xff0c;它的优势是什么&#xff1f;特性和定义B 树和 B 树的对比拓展&#xff1a;既然 B 树相较于 B 树优势如此之大&#xff0c;为什么 nosql 的 MongoDB 底层仍采用 B 树而不是 B 树&#xff1f; 使用 B 树做索引的优势补充&#xff…...

在Pycharm中将ui文件修改为py文件

在Pycharm中将ui文件修改为py文件 有些时候&#xff0c;我们需要把QTDesigner生成的.ui文件修改为.py文件 在一些教程中&#xff0c;通常使用cmd打开终端修改&#xff0c;或者是有一些人写了一些脚本来修改 这里我们可以使用pycharm来快速的修改 首先&#xff0c;我们在pyc…...

看视频学习方法总结

以下是提高教学视频吸收率的系统性方法&#xff0c;结合认知科学原理和实际学习场景&#xff0c;帮助您最大化学习效果&#xff1a; 一、观看前的黄金准备阶段 60秒快速扫描法 用1分钟快速浏览视频目录、章节标题和简介&#xff0c;建立知识框架。荷兰伊拉斯姆斯大学实验表明&…...

Matlab 大量接单

分享一个matlab接私活、兼职的平台 1、技术方向满足任一即可 2、技术要求 3、最后 技术方向满足即可 MATLAB&#xff1a;熟练掌握MATLAB编程语言&#xff0c;能够使用MATLAB进行数据处理、机器学习和深度学习等相关工作。 机器学习、深度学习、强化学习、仿真、复现、算法、…...

《深度剖析:生成对抗网络中生成器与判别器的高效协作之道》

在人工智能的前沿领域&#xff0c;生成对抗网络&#xff08;GAN&#xff09;以其独特的对抗学习机制&#xff0c;为数据生成和处理带来了革命性的变革。生成器与判别器作为GAN的核心组件&#xff0c;它们之间的协作效率直接决定了GAN在图像生成、数据增强、风格迁移等众多应用中…...

Android6到Android15版本新增的功能和api

Android6到Android15版本新增的功能和api 文章目录 Android6到Android15版本新增的功能和api一、前言二、Android6 后的版本迭代1、Android 6.0&#xff08;Marshmallow&#xff0c;API 级别 23&#xff09;新增功能重要 API 2、Android 7.0&#xff08;Nougat&#xff0c;API …...

【现代Web布局与动画技术:卡片组件实战分享】

&#x1f4f1; 现代Web布局与动画技术&#xff1a;卡片组件实战分享 &#x1f680; 引言 &#x1f31f; 在过去的开发过程中&#xff0c;我们共同实现了一个功能丰富的卡片组件&#xff0c;它不仅美观&#xff0c;还具有交互性和响应式设计。这篇文章将分享这个组件背后的技术…...

计算机网络之传输层(传输层提供的服务)

一、可靠的数据传输 传输层提供可靠的数据传输服务&#xff0c;确保数据在传输过程中不丢失、不重复、不乱序&#xff0c;并且能够被正确接收。这通常通过面向连接的协议&#xff08;如TCP&#xff09;来实现&#xff0c;TCP通过确认、重传、序号等机制来保证数据传输的可靠性…...

FPGA开发,使用Deepseek V3还是R1(1):应用场景

以下都是Deepseek生成的答案 FPGA开发&#xff0c;使用Deepseek V3还是R1&#xff08;1&#xff09;&#xff1a;应用场景 FPGA开发&#xff0c;使用Deepseek V3还是R1&#xff08;2&#xff09;&#xff1a;V3和R1的区别 FPGA开发&#xff0c;使用Deepseek V3还是R1&#x…...

哈希表和STL —— unorderde_set/unordered_map【复习笔记】

1. 哈希表的相关概念 1.1 哈希表的定义 哈希表&#xff0c;又称为散列表&#xff0c;是根据关键字直接进行访问的数据结构。 它通过一个哈希函数&#xff08;Hash Function&#xff09;&#xff0c;建立了一种关键字和存储地址间的直接映射关系&#xff0c;将每个关键字映射…...

计算机毕业设计SpringBoot+Vue.js体育馆使用预约平台(源码+文档+PPT+讲解)

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 作者简介&#xff1a;Java领…...

42 session反序列化漏洞

参考资料&#xff1a;3. php反序列化从入门到放弃(入门篇) - bmjoker - 博客园 session文件上传漏洞利用原理 当在php.ini中设置session.upload_progress.enabled On的时候&#xff0c;PHP将能够跟踪上传单个文件的上传进度。当上传正在进行时&#xff0c;以及在将与session…...

CertMagic故障恢复终极指南:如何从证书失效中快速恢复的10个关键步骤

CertMagic故障恢复终极指南&#xff1a;如何从证书失效中快速恢复的10个关键步骤 【免费下载链接】certmagic Automatic HTTPS for any Go program: fully-managed TLS certificate issuance and renewal 项目地址: https://gitcode.com/gh_mirrors/ce/certmagic CertMa…...

OpenClaw+Qwen2.5-VL-7B:自动化生成图文报告

OpenClawQwen2.5-VL-7B&#xff1a;自动化生成图文报告 1. 为什么需要自动化图文报告 作为一名数据分析师&#xff0c;我每天都要处理大量数据并生成报告。传统的工作流程是&#xff1a;先整理Excel表格&#xff0c;然后手动截图插入PPT&#xff0c;最后撰写分析文字。这个过…...

iMeta | 浙江农科院卢立志/曾涛联合中南大学湘雅医院揭示人参皂苷Rg3缓解肝脏铁死亡的新机制

点击蓝字 关注我们一种生物活性人参皂苷改善非酒精性脂肪性肝炎中氧化磷脂积累引起的肝细胞铁死亡iMeta主页&#xff1a;http://www.imeta.science研究论文● 原文: iMeta(IF 33.2, 中科院双一区Top)● 英文题目: A bioactive ginsenoside alleviates hepatocellular ferroptos…...

GTE-Pro语义检索系统国际化支持:中英混合Query与多语言文档联合检索

GTE-Pro语义检索系统国际化支持&#xff1a;中英混合Query与多语言文档联合检索 1. 引言&#xff1a;当搜索不再受限于语言 想象一下&#xff0c;你在一家跨国公司的技术文档库里查找资料。你的脑海里蹦出一个问题&#xff1a;“How to configure the 负载均衡器 for high av…...

丰田的“改善”到底牛在哪?-云质QMS为您解读精益生产的核心

提到丰田&#xff0c;大家第一反应大概率是精益生产、JIT 即时制&#xff0c;却很少有人深究&#xff0c;支撑丰田几十年持续领跑制造业的底层逻辑&#xff0c;其实是那个看似简单的日语词 ——改善&#xff08;kaizen&#xff09;。很多企业学丰田学了个皮毛&#xff0c;照搬流…...

YEDDA中文文本标注工具:零基础快速上手的高效标注解决方案

YEDDA中文文本标注工具&#xff1a;零基础快速上手的高效标注解决方案 【免费下载链接】yedda-py3 项目地址: https://gitcode.com/gh_mirrors/ye/yedda-py3 在人工智能和自然语言处理领域&#xff0c;数据标注是构建高质量模型的基础。YEDDA中文文本标注工具是一款专为…...

一个防止GPT“降智”的简单方法

GPT客户端容易“降智”&#xff1f;教你一个简单解决办法 正文 最近一直感觉 GPT 手机客户端有点“降智”&#xff0c;回答质量不太稳定。 后来我拿同一账号做了对比&#xff0c;发现用手机浏览器登录网页版时&#xff0c;整体会正常不少&#xff0c;所以来给大家分享一下。 我…...

OpenClaw故障模拟:Qwen3-14b_int4_awq异常输入处理与恢复机制

OpenClaw故障模拟&#xff1a;Qwen3-14b_int4_awq异常输入处理与恢复机制 1. 为什么需要主动制造故障 去年冬天的一个深夜&#xff0c;我的OpenClaw自动化流程突然中断了。当时它正在帮我整理一批技术文档&#xff0c;却在处理某个特殊字符时直接"卡死"。这次经历让…...

Ostrakon-VL-8B在VMware虚拟机中的一站式部署与性能调优

Ostrakon-VL-8B在VMware虚拟机中的一站式部署与性能调优 想在本地隔离环境里跑通一个强大的多模态大模型&#xff0c;比如Ostrakon-VL-8B&#xff0c;但又不想折腾物理机或者担心影响主系统&#xff1f;VMware虚拟机是个不错的选择。不过&#xff0c;在虚拟机里部署AI应用&…...

结合鸿蒙系统特性:在HarmonyOS应用中嵌入Pixel Couplet Gen生成能力

结合鸿蒙系统特性&#xff1a;在HarmonyOS应用中嵌入Pixel Couplet Gen生成能力 1. 引言&#xff1a;当传统艺术遇见分布式技术 春节贴春联是中国人延续千年的文化传统&#xff0c;而如今&#xff0c;借助AI技术和鸿蒙系统的分布式能力&#xff0c;我们可以让这一传统焕发新的…...