Linux——SIGCHLD信号——第17号信号

news2024/11/28 16:40:03

目录

什么是僵尸进程?

僵尸进程的目的?

如何避免僵尸进程?

总结:


提到SIGCHLD信号,就不得不先说一个有关僵尸状态的进程知识点了。

什么是僵尸进程?


        首先内核会释放终止进程(调用了exit系统调用)所使用的所有存情区,关闭所有打开的文件等,但内核为每一个终止子进程保存了一定量的信息,这些信息至少包括进程ID,进程的终止状态,以及该近程使用的CPU时间,所以当终止子进程的父进程调用wait或waitpid时就可以得到这些信息。
        而僵尸进程就是指:一个进程执行了exit系统调用函数后退出,而其父进程并没有为它收尸(调用wait或watpid来获得它的结束状态)的进程。任何一个子进程(init除外)在exit()后并非马上就消失,而是留下僵尸进程的数据结构,等待父进程处理,这是每个子进程都必需经历的阶段。另外子进程退出的时候会向其父进程发送一个SIGCHLD信号,通知父进程来收尸。——这个是关键,父进程能够及时回收子进程资源全凭借子进程退出时发送的这个信号来感知!

僵尸进程的目的?


        设置僵死状态的目的是维护子进程的信息,以便父进程在以后某个时候获取。这些信息至少包括进程ID,进程的终止状态,以及该进程使用的CPU时间,所以当终止子进程的父进程调用wait或waitpid时就可以得到这些信息,如果一个进程终止,而该进程有子进程处于僵尸状态,那么它的所有僵尸子进程的父进程ID将被重置为1 (init进程)。继承这些子进理的init进程将wait它们(也就是说init进程将wait它们,从而去除它们的僵尸状态)。 

#include<signal.h>
#include<stdio.h>
#include<unistd.h>
#include<stdlib.h>
#include<sys/types .h>

void Count(int cnt){    //定时器
    while(cnt)fprintf("cnt: %d\r");
    fflush(stdout);
    cnt--;
}

void myhandler(int signo){
    printf("%d号信号已被捕况到,表明子进机退出后发送了SIGCHLD信号给父进程\n",signo);
}

int main(){
    printf("我是父进程,我的pid:%d\n",getpid());
    //信号捕捉
    signal(SIGCHLD,myhandler);
    pid_t id=fork();    //创建子进程

    //信号捕捉
    signal(SIGCHLD,myhandler);
                       
    if(id==0)(         //id==0 子进程
    printf("我是子进程,我的pid:%d 我的ppid:%d\n",getpid(),getppid());
    Count(5);
    printf("子进程已退\n");
    exit(1);   //退出子进程,子进程比父进任先退出后成为信,进和,需要父进和进行回收才行

    //那么父进程怎么个会知道子进程何时退出呢? 一子进程一定会发送信号给父进程,
    //父进任收到该信号就会对子进程进行资源的回收

    //id>0 为父进程
    else{
        while(1)
            sleep(1);
        }
        return 0;
    }

运行结果:

        从上图结果中可知:子进程退出后发送了一个信号给父进程,而我在代码中使用signal函数对SIGCHLD信号进行捕获,发现确实捕获到了,论证了子进程退出后会发送SIGCHLD信号给父进程,父进程收到了信号,进而回收子进程资源。

如何避免僵尸进程?

       1.通过signal(SIGCHLD,SIGIGN)通知内核对子进程的结束不关心,由内核回收。如果不想让父进程挂起,可以在父进程中加入一条语句: siqnal(SIGCHLD,SIG IGN);表示父进程忽略SIGCHLD信号,该信号是子进程退出的时候向父进程发送的。

代码如下:

        如上图: signal函数中向进程发送的SIGCHLD信号后,进程会对该信号做SIG_IGN处理,说白了就是:在我们之前学习进程时,父进程创建子进程,子进程退出后若父进程不进行回收,子进程会成为僵尸进程。而且父进程不知道子进程什么时候退出,父进程可以采用阻塞等待的方式等子进程结束,也可以采用非阻塞地查询是否有子进程结束等待清理(也就是轮询的方式);


        若采用第一种方式,父进程阻塞了就不能处理自己的工作了(父进程只能干等着);而采用第二种方式,父进程在处理自己的工作的同时还要记得时不时地轮询一下,程序实现复杂。 

        若采用了忽略的方式去让父进程递达处理信号,那么父进程就再也不会阻塞和非阻塞的等待子进程结束,而父进程会专心做自己的事情,等到子进程退出时,会自动被清理回收掉,不会产生僵尸进程,也不会通知父进程。十分方便!

        2.父进程调用wait/waitpid等函数等待了进程结束,如果尚无子进程退出wait()会导致父进程阻塞。waitpid()可以通过传递WNOHANG参数使父进程不阻塞立即返回;


        3.如果父进程很忙可以用signal()信号捕捉函数,在信号处理函数调用wait()/waitpid()等待子进程退出。

    注:父进程采用signal函数捕捉子进程退出的时候发出的SIGCHLD信号,捕捉到后,父进程会被通知子进程已退出,然后采用waitpid方法去回收子进程。

        4.通过两次调用fork。父进程首先调用fork()创建一个子进程然后waitpid()等待子进程退出,子进程再fork()一个孙进程后退出。这样子进程退出后会被父进程等待回收,而对于孙子进程其父进程已经退出,所以子进程成为一个孤儿进程,孤儿进程由i计进程接管,子进程结束后,init进程会等待回收。

总结:

        使用signal信号捕捉方法忽略SIGCHLD信号,这常用于并发服务器的性能的一个技巧,因为并发服务器常常fork很多子进程,子进程终结之后需要服务器进程去wait清理资源。如果将此信号的处理方式设为忽略,可以内核把僵尸子进程转交给init进程去处理,省去了大量僵尸进程占用系统资源。
  

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

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

相关文章

计代码行数cloc,一个代码统计行数很好用的工具

分为window、mac系统区分&#xff0c;基本是一样的&#xff0c;一个代码统计行数很好用的工具。 CLOC简介 Cloc是一款使用Perl语言开发的开源代码统计工具&#xff0c;支持多平台使用、多语言识别&#xff0c;能够计算指定目标文件或文件夹中的文件数&#xff08;files&#x…

Linux——sigaction信号捕捉函数

目录 一.sigaction () ; struct sigaction结构体的成员&#xff1a; sigaction()和signal()函数的区别&#xff1a; 二.sigaction函数的使用 sigaction函数使用案例1&#xff1a; 对该进程发送指定的信号 案例2&#xff1a;对该进程发送多个同类型的信号时&#xff1a; …

vim中文帮助文档安装

vim自带的帮助手册是英文的, 对平时编程的人来说没有多大阅读困难,在何况还有"星级译王"呢, 但是我猜和我一样连英语四级都愁的大有人&#xff0c;可偏偏就有一帮好心人人将其翻译成了中文, 可偏偏我又挡不住诱惑将它安装了, 唉.......又痛失一个学习英文的好机会, 下…

J2EE集合框架Map

目录 一.Map特点 1.无序&#xff0c;键值对&#xff0c;键不能重复&#xff0c;值可以重复 2.键重复则覆盖&#xff0c;没有继承Collection接口 二.遍历方式 1.拿到key,再拿值2.拿到映射关系&#xff0c;键值都有 取出保存所有Entry的Set,再遍历此Set即可 三.HashMap与H…

SpringBoot实现返回值数据脱敏

介绍 SpringBoot实现返回数据脱敏 有时&#xff0c;敏感数据返回时&#xff0c;需要进行隐藏处理&#xff0c;但是如果一个字段一个字段的进行硬编码处理的话&#xff0c;不仅增加了工作量&#xff0c;而且后期需求变动的时候&#xff0c;更加是地狱般的工作量变更。 下面&am…

HLS入门简述

What‘s HLS&#xff1f; HLS&#xff08;High-Level Synthesis&#xff09;高层次综合。何谓高层次&#xff1f;意味着我们可以使用高层次的语言来对设计进行描述&#xff0c;如C&#xff0c;C&#xff0c;System C等&#xff1b;那何谓综合呢&#xff1f;HLS在其中起了重要的…

Denosing score matching (公式+代码)

加噪声的分数匹配 def anneal_dsm_score_estimation(scorenet, samples, labels, sigmas, anneal_power2.):# 取出每个样本对应噪声级别下的噪声分布的标准差&#xff0c;即公式中的sigma_i&#xff0c;# 这里的 labels 是用于标识每个样本的噪声级别的&#xff0c;就是 i&…

JavaEE——常见的锁策略、CAS、synchronized 原理(八股)

文章目录 一、常见的锁策略1.乐观锁 & 悲观锁2.轻量级锁 & 重量级锁3.自旋锁 & 挂起等待锁4.互斥锁 & 读写锁5. 公平锁 & 非公平锁 二、CAS1、什么是 CAS2. CAS 的应用场景2.实现自旋锁3. CAS 中的 ABA 问题 三、 Synchronized 原理 一、常见的锁策略 当前…

DataFun: ChatGPT背后的模型详解

ChatGPT背后的模型详解 Overview Transofrmer 各个构件都有一定的作用 Multi-head self attention 每个字的重要性不一样&#xff0c;学习QKV三个矩阵&#xff08;query&#xff0c;key&#xff0c;value&#xff09; 多组QKV RLHF ChatGPT训练过程 思维链 COT

C++_简单模拟实现string的基本结构

C中&#xff0c;string早于STL问世。使用string中的构造函数可以实现对string类型的字符串的一系列操作。 今天来模拟C中的string的基本结构。注意仅仅是简单模拟&#xff0c;string内部结构其实非常复杂&#xff0c;并且不同版本的IDEstring的内部结构也不尽相同。尽管有所不…

SpringBoot2+Vue2实战(十五)高德地图集成

1.地图官网&#xff1a; 高德开放平台 | 高德地图API 2.开发文档(web js) 正式集成&#xff1a; 1.再index.html中引入script标签 <script type"text/javascript" src"https://webapi.amap.com/maps?v2.0&key您申请的key值"></script>…

第五章 PCIe介绍 5.1-5.7

5.1 从PCIe的速度说起 为什么SSD要用PCIe接口&#xff1f;因为它快&#xff0c;比SATA快。 Lane&#xff1a;通道&#xff0c;PCIe最多可以有32个通道。 1. PCIe的工作模式 两个设备之间的PCIe连接&#xff0c;叫做一个Link。如下图&#xff0c;设备A和设备B是个双向连接&#…

【读书笔记】只管去做

《只管去做》是一本很容易读完的书&#xff0c;这本书是以故事的形式来阐述把愿景落实到每天的行动中的方法&#xff0c;对我们做人生规划很有帮助。

使用leaflet在html中加载天地图且去掉左上角的缩放图标以及右下角的logo

前言 我们这一节使用轻量化的javascript库leaflet来实现在html中加载天地图&#xff0c;实现类似高德地图、百度地图的效果。 效果图如下&#xff1a; 话不多说&#xff0c;进入主题&#xff01;&#xff01; 一、注册开发者权限 我们需要在天地图平台注册一个账号&#xff0…

【Qt】VS2013+QT5.6.3环境搭建

安装VS2013 略 安装Qt 安装文件&#xff1a;qt-opensource-windows-x86-msvc2013-5.6.3.exe&#xff08;官网已经不提供下载了。&#xff09; 安装步骤&#xff1a;安装到C盘根目录&#xff0c;其它略。 安装qt vs插件 1、下载地址&#xff1a; https://download.qt.io/a…

string常见功能模拟

学到string终于就不用像c语言一样造轮子了&#xff0c;接下来我们就模拟一下string方便我们更好理解string&#xff0c;首先我们都知道库里有个string&#xff0c;所以为了避免我们的string和库里的冲突&#xff0c;要用命名空间my_string将我们写的string包含在内。string的成…

精准医学时代:探索人工智能在DCA曲线下的临床医学应用

一、引言 在当今医学领域中&#xff0c;精准医学作为一种以个体差异为基础的医疗模式逐渐受到重视和应用[1]。精准医学基于个体基因组、环境和生活方式因素的综合分析&#xff0c;旨在实现个体化的预防、诊断和治疗方案&#xff0c;从而提供更好的临床结果[2]。与传统医学相比&…

MACD进阶版指标公式,提前一天判断MACD金叉

MACD是一种常用的技术分析指标&#xff0c;用于判断价格的趋势和动能&#xff0c;其原理是基于两条指数移动平均线的比较和对价格的平滑处理&#xff0c;MACD金叉是指MACD指标中的快线DIF从下方向上穿过慢线DEA。快线、慢线都是根据收盘价计算出来的&#xff0c;如果想提前一天…

STM32基础知识点总结

一、基础知识点 1、课程体系介绍 单片机概述arm体系结构STM32开发环境搭建 STM32-GPIO编程-点亮世界的那盏灯 STM32-USART串口应用SPI液晶屏 STM32-中断系统 STM32-时钟系统 STM32-ADC DMA 温湿度传感器-DHT11 2.如何学习单片机课程 多听理论、多理解、有问题及时提问 自己多…