僵尸进程的产生与处理

僵尸进程是指在进程结束后,其父进程没有及时处理该进程的终止状态信息,导致该进程的进程描述符仍然存在于系统进程表中,但是已经没有实际的执行代码。这样的进程被称为僵尸进程。

僵尸进程的产生是由于父进程没有及时调用`wait()`或`waitpid()`等系统调用来获取子进程的终止状态信息。当子进程结束时,内核会将其进程描述符保留在系统进程表中,并向父进程发送一个SIGCHLD信号,通知父进程子进程已经终止。如果父进程没有处理该信号或没有主动调用`wait()`等系统调用来处理子进程的终止状态,那么僵尸进程就会产生。

如下是一个产生僵尸进程的代码

void fork7() {if (fork() == 0) {/* Child */printf("Terminating Child, PID = %d\n", getpid());exit(0);} else {printf("Running Parent, PID = %d\n", getpid());while (1); /* Infinite loop */}
}

其中子进程已经完成执行,但是进程表中仍然存在子进程的信息。,并显示为defunct状态,即zombie进程。

wait()waitpid()是用于在父进程中等待子进程终止并获取其终止状态的系统调用函数。

这两个函数的作用包括:

  1. 等待子进程的终止:父进程可以使用wait()waitpid()函数来暂停自己的执行,等待子进程结束。在子进程终止之前,父进程会一直阻塞在这个调用上。

  2. 获取子进程的终止状态:当子进程终止时,操作系统会将子进程的退出状态传递给父进程。父进程通过调用wait()waitpid()来获取子进程的终止状态,并可以根据该状态进行后续处理。终止状态可以包含子进程的退出码、终止原因等信息。

pid_t wait(int* status);

  • status参数用于保存子进程的终止状态。通过检查status变量的值,父进程可以了解子进程的终止情况。
  • wait()函数返回已终止的子进程的PID,若出错则返回-1。

pid_t waitpid(pid_t pid, int* status, int options); 

  • pid参数用于指定等待的子进程ID。当指定为-1时,表示等待任意一个子进程终止。
  • status参数用于保存子进程的终止状态。
  • options参数用于设置额外的选项,例如WNOHANG表示非阻塞等待。

wait()waitpid()函数的返回值可以提供一些信息:

  • 返回一个大于0的值表示已终止的子进程的PID。
  • 返回0表示使用了WNOHANG选项,且当前没有已终止的子进程。
  • 返回-1表示调用出错,可能是由于权限问题或者无效的参数。

示例

void fork9() {int child_status;if (fork() == 0) {printf("HC: hello from child\n");} else {printf("HP: hello from parent\n");wait(&child_status);printf("CT: child has terminated\n");}printf("Bye\n");
}

父进程通过使用wait函数来暂停自己的执行,等待子进程结束,在子进程终止之前,父进程会一直阻塞在这个调用上

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

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

相关文章

postgresql16-新特性

postgresql16-新特性 any_value数组抽样数组排序 any_value any_value 返回任意一个值 select e.department_id ,count(*), any_value(e.last_name) from cps.public.employees e group by e.department_id ;数组抽样 -- 从数组中随机抽取一个元素 array_sample(数组&#…

ChatGPT付费创作系统V2.3.4独立版 +WEB端+ H5端 + 小程序最新前端

人类小徐提供的GPT付费体验系统最新版系统是一款基于ThinkPHP框架开发的AI问答小程序,是基于国外很火的ChatGPT进行开发的Ai智能问答小程序。当前全民热议ChatGPT,流量超级大,引流不要太简单!一键下单即可拥有自己的GPT&#xff0…

Spring5应用之Cglib动态代理

作者简介:☕️大家好,我是Aomsir,一个爱折腾的开发者! 个人主页:Aomsir_Spring5应用专栏,Netty应用专栏,RPC应用专栏-CSDN博客 当前专栏:Spring5应用专栏_Aomsir的博客-CSDN博客 文章目录 前言Cglib动态代理…

六、vpp 流表+负载均衡

草稿!!! vpp node其实就是三个部分 1、plugin init 2、set command 3、function 实现功能,比如这里的流表 今天我们再用VPP实现一个流表的功能 一、流表 1.1流表----plugin init VLIB_REGISTER_NODE 注册流表节点 // 注册流…

Ipython和Jupyter Notebook介绍

Ipython和Jupyter Notebook介绍 Python、IPython和Jupyter Notebook是三个不同但密切相关的工具。简而言之,Python是编程语言本身,IPython是对Python的增强版本,而Jupyter Notebook是一种在Web上进行交互式计算的环境,使用IPytho…

1.1 数据库系统概述

思维导图: 前言: **数据库前言笔记:** 1. **数据库的价值** - 数据管理的高效工具 - 计算机科学的关键分支 2. **信息资源的重要性** - 现代企业或组织的生存和发展关键 - 建立有效的信息系统至关重要 3. **数据库的应用范围**…

使用python-opencv检测图片中的人像

最简单的方法进行图片中的人像检测 使用python-opencv配合yolov3模型进行图片中的人像检测 1、安装python-opencv、numpy pip install opencv-python pip install numpy 2、下载yolo模型文件和配置文件: 下载地址: https://download.csdn.net/down…

GEE16: 区域日均降水量计算

Precipitation 1. 区域日均降水量计算2. 降水时间序列3. 降水数据年度时间序列对比分析 1. 区域日均降水量计算 今天分析一个计算区域日均降水量的方法: 数据信息:   Climate Hazards Group InfraRed Precipitation with Station data (CHIRPS) is a…

微信公众号模板消息First,Remark字段不显示,备注字段不见了

今天在开发公众号过程中有个需求发模板消息我设置的如下 成绩单打印通知!姓名:{{name.DATA}} 学号:{{stuid.DATA}}状态:{{status.DATA}}时间:{{date.DATA}} 备注:{{remark.DATA}} 然后发完通知发现《…

JAVA面经整理(8)

一)为什么要有区,段,页? 1)页是内存和磁盘之间交互的基本单位内存中的值修改之后刷到磁盘的时候还是以页为单位的索引结构给程序员提供了高效的索引实现方式,不过索引信息以及数据记录都是记录在文件上面的,确切来说是…

MySql运维篇---008:日志:错误日志、二进制日志、查询日志、慢查询日志,主从复制:概述 虚拟机更改ip注意事项、原理、搭建步骤

1. 日志 1.1 错误日志 错误日志是 MySQL 中最重要的日志之一,它记录了当 mysqld 启动和停止时,以及服务器在运行过程中发生任何严重错误时的相关信息。当数据库出现任何故障导致无法正常使用时,建议首先查看此日志。 该日志是默认开启的&a…

【算法学习】-【双指针】-【盛水最多的容器】

LeetCode原题链接:盛水最多的容器 下面是题目描述: 给定一个长度为 n 的整数数组 height 。有 n 条垂线,第 i 条线的两个端点是 (i, 0) 和 (i, height[i]) 。 找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。…