僵尸进程的产生与处理
僵尸进程(Zombie Process)是指在操作系统中已经完成了执行,但其父进程尚未调用wait()或waitpid()来获取其终止状态的子进程。当一个进程结束时,操作系统会保留该进程的一些基本信息,包括进程ID(PID)、退出状态等,以供父进程查询。而如果父进程没有主动调用上述函数来检索该进程的状态,那么这个进程的信息就会一直存在于操作系统的进程表中,成为僵尸进程。
如下是一个产生僵尸进程的代码
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()是用于在父进程中等待子进程终止并获取其终止状态的系统调用函数。
这两个函数的作用包括:
-
等待子进程的终止:父进程可以使用
wait()或waitpid()函数来暂停自己的执行,等待子进程结束。在子进程终止之前,父进程会一直阻塞在这个调用上。 -
获取子进程的终止状态:当子进程终止时,操作系统会将子进程的退出状态传递给父进程。父进程通过调用
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函数来暂停自己的执行,等待子进程结束,在子进程终止之前,父进程会一直阻塞在这个调用上

相关文章:
僵尸进程的产生与处理
僵尸进程(Zombie Process)是指在操作系统中已经完成了执行,但其父进程尚未调用wait()或waitpid()来获取其终止状态的子进程。当一个进程结束时,操作系统会保留该进程的一些基本信息,包括进程ID(PID…...
TouchEffects - Android View点击特效
官网 GitHub - likaiyuan559/TouchEffects: Android View点击特效TouchEffects,几行代码为所有控件添加点击效果 项目简介 Android View点击特效TouchEffects,几行代码为所有控件添加点击效果 TouchEffects能够帮助你更快速方便的增加点击时候的效果,TouchEffect…...
从ContinuousEventTimeTrigger/ContinuousProcessingTimeTrigger代码看如何实现一个自定义的触发器
背景 当我们想要实现提前触发计算的触发器时,我们可以使用ContinuousEventTimeTrigger/ContinuousProcessingTimeTrigger作为触发器达到比如几分钟触发一次计算并发送计算结果的类,我们本文就从代码角度解析下实现自定义触发器的一些注意事项 Continuo…...
Linux 5种网络模型
[参考]:《黑马程序员Redis》https://www.bilibili.com/video/BV1cr4y1671t/?p166&share_sourcecopy_web&vd_source9e65300ccca322aeb367bb1eb677b0fc [参考]:《操作系统》 [参考]:《UNIX网络编程》 为了避免用户应用导致冲突甚至内…...
10.1 调试事件读取寄存器
当读者需要获取到特定进程内的寄存器信息时,则需要在上述代码中进行完善,首先需要编写CREATE_PROCESS_DEBUG_EVENT事件,程序被首次加载进入内存时会被触发此事件,在该事件内首先我们通过lpStartAddress属性获取到当前程序的入口地…...
Linux系统常用指令篇---(一)
Linux系统常用指令篇—(一) 1.cd指令 Linux系统中,磁盘上的文件和目录被组成一棵目录树,每个节点都是目录或文件。 语法:cd 目录名 功能:改变工作目录。将当前工作目录改变到指定的目录下。 (简单理解为进入指定目录下) 举例: cd .. : 返…...
【初识Linux】:常见指令(1)
朋友们、伙计们,我们又见面了,本期来给大家解读一下有关Linux的基础知识点,如果看完之后对你有一定的启发,那么请留下你的三连,祝大家心想事成! C 语 言 专 栏:C语言:从入门到精通 数…...
STM32复习笔记(四):看门狗
目录 (一)简介 (二)IWDG IWDG的CUBEMX工程配置 IWDG相关函数(非常少,所以直接贴上来): (三)WWDG (一)简介 看门狗分为独立看门…...
【C++进阶(七)】仿函数深度剖析模板进阶讲解
💓博主CSDN主页:杭电码农-NEO💓 ⏩专栏分类:C从入门到精通⏪ 🚚代码仓库:NEO的学习日记🚚 🌹关注我🫵带你学习C 🔝🔝 模板进阶 1. 前言2. 仿函数的概念3. 仿函数的实…...
基于SSM的电动车上牌管理系统(有报告)。Javaee项目。
演示视频: 基于SSM的电动车上牌管理系统(有报告)。Javaee项目。 项目介绍: 采用M(model)V(view)C(controller)三层体系结构,通过Spring SpringM…...
mstsc无法保存RDP凭据, 100%生效
问题 即使如下两项都打勾,其还是无法保存凭据,特别是连接Ubuntu (freerdp server): 解决方法 网上多种复杂方法,不生效,其思路是修改后台配置,以使mstsc跟平常一样自动记住凭据。最后,如下的…...
OpenGLES:绘制一个混色旋转的3D球体
效果展示 本篇博文会实现一个混色旋转的3D球体 一.球体解析 前面几篇博文讲解了如何使用OpenGLES实现不同的3D图形 本篇博文讲解怎样实现3D世界的代表图形:一个混色旋转的3D球体 1.1 极限正多面体 如果有学习过我前几篇3D图形绘制的博文,就知道要想…...
Spring AOP 基于注解源码整理
导入配置类 EnableAspectJAutoProxy 注解导入 AspectJAutoProxyRegistrarImportBeanDefinitionRegistrar#registerBeanDefinitions向容器中加入AnnotationAwareAspectJAutoProxyCreatorAnnotationAwareAspectJAutoProxyCreator#initBeanFactory初始化ReflectiveAspectJAdvisor…...
C语言 —— 函数栈帧的创建和销毁
在我们之前学习函数的时候,我们可能有很多困惑? 比如: 局部变量是怎么创建的?为什么局部变量的值是随机值?函数是怎么传参的?传参的顺序是怎样的?形参和实参是什么关系?函数调用是怎么做的?函数调用是结束后怎么返回的? 那么要解决这些问题, 我们就需要知道…...
Appleid苹果账号自动解锁改密(自动解锁二验改密码)
目前该项目能实现以下功能: 多用户使用,权限控制多账号管理账号分享页,支持设置密码、有效期、自定义HTML内容自动解锁与关闭二步验证自动/定时修改密码自动删除Apple ID中的设备代理池与Selenium集群,提高解锁成功率允许手动触发…...
Conflicting peer dependency: eslint@8.50.0
npm install 输出 npm ERR! code ERESOLVE npm ERR! ERESOLVE could not resolve npm ERR! npm ERR! While resolving: vue/eslint-config-standard6.1.0 npm ERR! Found: eslint-plugin-vue8.7.1 npm ERR! node_modules/eslint-plugin-vue npm ERR! dev eslint-plugin-vue…...
Vue3 defineProps使用
MyTag.vue <script setup> import { ref, nextTick, defineProps, defineEmits } from "vue"; const props defineProps({flag: Boolean,title: String, }); // 写成这样也可以 // const props defineProps(["flag", "title"]);const e…...
机器学习7:逻辑回归
一、说明 逻辑回归模型是处理分类问题的最常见机器学习模型之一。二项式逻辑回归只是逻辑回归模型的一种类型。它指的是两个变量的分类,其中概率用于确定二元结果,因此“二项式”中的“bi”。结果为真或假 — 0 或 1。 二项式逻辑回归的一个例子是预测人…...
生活小记-纸张尺寸
A系列纸张: A0:841 x 1189 毫米A1:594 x 841 毫米A2:420 x 594 毫米A3:297 x 420 毫米A4:210 x 297 毫米A5:148 x 210 毫米A6:105 x 148 毫米A7:74 x 105 毫米A8…...
【MATLAB源码-第41期】基于压缩感知算法的OFDM系统信道估计和LS算法对比仿真。
操作环境: MATLAB 2013b 1、算法描述 压缩感知(Compressed Sensing, CS)是一种从稀疏或可压缩信号中重构完整信号的数学理论和技术。下面详细介绍压缩感知和它在OFDM信道估计中的应用。 1. 压缩感知基本概念 在传统采样理论中࿰…...
开源情报工具Openeir:自动化资产发现与关联分析实战指南
1. 项目概述:一个开源情报(OSINT)工具的诞生与使命 在信息爆炸的时代,数据本身不再是稀缺品,如何从海量、异构、碎片化的公开信息中,精准、高效地提取出有价值的情报,才是真正的挑战。无论是安全…...
Selenium自动化ChatGPT:绕过API限制,实现Web端高效批量交互
1. 项目概述与核心价值最近在GitHub上看到一个挺有意思的项目,叫“Michelangelo27/chatgpt_selenium_automation”。光看名字,你大概能猜到它想做什么:用Selenium自动化操作ChatGPT。这听起来是不是有点“用大炮打蚊子”的感觉?毕…...
AI伦理实战:从偏见、可解释性到隐私保护的工程化解决方案
1. 项目概述:当AI从实验室走向现实,我们面临什么?几年前,我还在实验室里为一个模型的准确率提升0.5个百分点而兴奋不已。那时,“伦理”这个词,对我们这些埋头调参的工程师来说,似乎还停留在哲学…...
JavaScript自动化PPT生成:如何用代码解放你的演示文稿生产力
JavaScript自动化PPT生成:如何用代码解放你的演示文稿生产力 【免费下载链接】PptxGenJS Build PowerPoint presentations with JavaScript. Works with Node, React, web browsers, and more. 项目地址: https://gitcode.com/gh_mirrors/pp/PptxGenJS 还在为…...
三阶段掌握罗技鼠标压枪宏:从新手到精准射击的完整指南
三阶段掌握罗技鼠标压枪宏:从新手到精准射击的完整指南 【免费下载链接】logitech-pubg PUBG no recoil script for Logitech gaming mouse / 绝地求生 罗技 鼠标宏 项目地址: https://gitcode.com/gh_mirrors/lo/logitech-pubg 你是否在绝地求生中遇到过这样…...
AI信息摘要系统:从RSS抓取到LLM摘要的自动化实现
1. 项目概述:AI驱动的每日信息摘要最近在GitHub上看到一个挺有意思的项目,叫“ai-daily-digest”。光看名字,你大概能猜到它想做什么:用人工智能来帮你整理每日信息。但具体怎么实现,能解决什么问题,背后又…...
华为2288H V5服务器折腾记:LSI SAS3008阵列卡的IT与IR模式到底该怎么选?
华为2288H V5服务器实战:LSI SAS3008阵列卡IT与IR模式深度解析 当你第一次接触华为2288H V5服务器时,那块小小的LSI SAS3008阵列卡可能会让你陷入选择困难——到底该用IT模式还是IR模式?这个问题看似简单,却直接影响着服务器的存储…...
如何用JPlag守护代码原创性:5分钟快速上手指南
如何用JPlag守护代码原创性:5分钟快速上手指南 【免费下载链接】JPlag State-of-the-Art Source Code Plagiarism & Collusion Detection. Check for plagiarism in a set of programs. 项目地址: https://gitcode.com/gh_mirrors/jp/JPlag 你是否曾担心…...
LayerDivider:如何用3步将单张插画自动分层为可编辑PSD文件?
LayerDivider:如何用3步将单张插画自动分层为可编辑PSD文件? 【免费下载链接】layerdivider A tool to divide a single illustration into a layered structure. 项目地址: https://gitcode.com/gh_mirrors/la/layerdivider 你是否曾经面对一张精…...
LabVIEW循环进阶:隧道模式与移位寄存器的实战解析
1. LabVIEW循环基础回顾与隧道模式初探 在LabVIEW编程中,For循环是最基础也是最常用的结构之一。很多初学者都能轻松掌握循环次数N和循环索引i的基本用法,但当涉及到数据进出循环时的处理方式,往往会遇到困惑。这就是我们今天要重点讨论的隧…...
