尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
孤儿进程和僵尸进程分别是什么?怎么形成的?
1. 引言在 Linux 系统中进程管理是操作系统核心功能之一。孤儿进程和僵尸进程是进程生命周期中两种常见且容易混淆的状态。理解它们的形成原因、区别以及处理方法对于系统运维和后台服务开发都非常重要。2. 进程的基本概念在深入讨论之前先回顾几个关键概念父进程创建其他进程的进程通常通过fork()系统调用产生子进程。子进程由父进程创建的新进程继承父进程的代码、数据和资源。进程状态进程在生命周期中会经历运行、就绪、阻塞、停止等多种状态。进程表内核维护的数据结构记录每个进程的 PID、状态、退出码等信息。3. 孤儿进程3.1 什么是孤儿进程孤儿进程是指父进程已经退出但子进程仍在运行的进程。此时子进程的父进程变为 init 进程PID 为 1由 init 进程负责回收。3.2 形成过程孤儿进程的形成过程如下父进程通过fork()创建子进程。父进程在子进程尚未结束时提前退出例如正常结束、崩溃或被杀死。内核将子进程的父进程重新设置为 init 进程。init 进程接管该子进程并在其退出时负责回收资源。3.3 示例代码#include stdio.h #include unistd.h #include stdlib.h int main() { pid_t pid fork(); if (pid 0) { perror(fork); exit(1); } if (pid 0) { // 子进程 printf(子进程 PID%d, 父进程 PID%d\n, getpid(), getppid()); sleep(5); printf(子进程醒来父进程 PID%d\n, getppid()); } else { // 父进程立即退出 printf(父进程 PID%d 退出\n, getpid()); exit(0); } return 0; }运行后可以看到子进程醒来时其父进程 PID 已经变为 1init 进程。3.4 孤儿进程的影响孤儿进程本身不会造成资源泄漏因为 init 进程会负责回收。但在容器或嵌入式环境中如果 init 进程被替换或缺失孤儿进程可能无法被正确回收导致资源占用。4. 僵尸进程4.1 什么是僵尸进程僵尸进程是指子进程已经终止但其退出状态尚未被父进程读取的进程。此时子进程已经释放了大部分资源但在进程表中仍保留一条记录等待父进程调用wait()或waitpid()获取其退出状态。4.2 形成过程僵尸进程的形成过程如下父进程通过fork()创建子进程。子进程运行结束调用exit()退出。内核保留子进程的退出状态和进程表项等待父进程读取。如果父进程没有调用wait()或waitpid()子进程就变成僵尸进程。4.3 示例代码#include stdio.h #include unistd.h #include stdlib.h int main() { pid_t pid fork(); if (pid 0) { perror(fork); exit(1); } if (pid 0) { // 子进程立即退出 printf(子进程 PID%d 退出\n, getpid()); exit(0); } else { // 父进程不调用 wait睡眠观察 printf(父进程 PID%d 睡眠不回收子进程\n, getpid()); sleep(10); } return 0; }运行期间执行ps -ef | grep defunct可以看到状态为 Z 的僵尸进程。4.4 僵尸进程的影响僵尸进程无法被杀死kill 无效因为其已经终止。如果父进程长期不回收僵尸进程会持续占用进程表项当进程表满时系统将无法创建新进程。5. 孤儿进程与僵尸进程的区别对比项孤儿进程僵尸进程进程状态仍在运行已终止等待回收父进程状态父进程已退出父进程仍在运行资源占用占用正常资源仅占用进程表项能否被 kill可以不能回收方式由 init 进程接管由父进程调用 wait()危害程度一般较小可能耗尽进程表6. 如何避免僵尸进程6.1 父进程调用 wait()父进程在子进程退出后调用wait()或waitpid()及时回收子进程的退出状态。6.2 使用信号处理父进程注册SIGCHLD信号处理函数在子进程退出时自动回收。#include stdio.h #include unistd.h #include stdlib.h #include signal.h #include sys/wait.h void handler(int sig) { while (waitpid(-1, NULL, WNOHANG) 0); } int main() { signal(SIGCHLD, handler); pid_t pid fork(); if (pid 0) { printf(子进程退出\n); exit(0); } sleep(5); return 0; }6.3 双重 fork父进程 fork 一个子进程子进程再 fork 孙进程后立即退出孙进程由 init 进程接管从而避免僵尸进程。7. 总结孤儿进程和僵尸进程是进程生命周期中的两种特殊状态。孤儿进程是父进程先退出子进程被 init 接管僵尸进程是子进程先退出父进程未回收。理解它们的形成机制和区别有助于编写健壮的后台服务避免进程表耗尽等问题。
RELATED

相关推荐

LVGL 9.2.2模拟器VS2022搭建:从环境配置到交互调试

LVGL 9.2.2模拟器VS2022搭建:从环境配置到交互调试

简介:面向嵌入式图形界面开发者与 LVGL 学习者的 9.2.2 模拟器完整工程,解决在 Windows 环境下使用 Visual Studio 2022 快速搭建模拟运行环境、验证界面逻辑与控件交互的实际需求。工程集成了模拟器核心源码、VS2022 项目配置以及大量示例界面资源&…

📅 2026/10/3 4:43:51
基于ThinkPHP 5+Vue.js+MySQL的个人记账管理系统毕业设计实战

基于ThinkPHP 5+Vue.js+MySQL的个人记账管理系统毕业设计实战

在实际的计算机专业毕业设计选题中,一个融合了后端框架、前端框架和数据库的“个人记账管理系统”是一个经典且实用的选择。它不仅能串联起Web开发的核心技术栈,还能体现一个开发者从需求分析、技术选型、编码实现到系统部署的完整工程能力。对于即将在2…

📅 2026/10/17 11:29:50
STM32F103与HMC5883L实现电子罗盘:I2C通信、校准与航向解算

STM32F103与HMC5883L实现电子罗盘:I2C通信、校准与航向解算

简介:STM32F103与HMC5883L数字磁力计的嵌入式开发工程,面向电子罗盘、地磁导航、姿态测量及惯性导航项目开发者,也适合正在学习STM32外设接口与传感器驱动的进阶学生。工程完整实现了HMC5883L的底层驱动,包含IC/SPI总线初始化与配…

📅 2026/10/4 3:07:16
MORE NEWS

更多资讯

📰

太仓报名中级电工证官方回应:考不过白交培训费?别慌,这些干货能帮上忙

太仓报名中级电工证官方回应:考不过白交培训费?别慌,这些干货能帮上忙 怕考不过白交培训费?别急,官方回应来了!你不是一个人在战斗,太多人和你一样,花了钱还怕拿不到证,耽误了工作也丢了面子。其实,只要方法对了,中级电工证考试并不难,关键是要了…

📰

电工证复审有几次在哪考一次搞定不白交培训费

电工证复审有几次在哪考一次搞定不白交培训费 怕考不过白交培训费?电工证复审有几次在哪考你得搞清楚,别被培训机构忽悠了。很多人一到复审就慌,担心流程复杂、内容难懂,最后钱花了还白忙一场。其实只要方法对,复审也能轻松搞定。下面从南阳卧龙区的实际…

📰

特种工证书都有什么用?内部消息告诉你实操考试心里没底怕挂科怎么办

特种工证书都有什么用?内部消息告诉你实操考试心里没底怕挂科怎么办 实操考试心里没底怕挂科,这是几乎所有准备考取特种工证书的人都会遇到的问题。尤其是像低压电工、焊工这些实操要求高、考试流程复杂的工种,很多人都担心自己一不小心就挂了,白费时间和…

📰

唐县电工证怎么报考实操考试考什么全国通用

唐县电工证怎么报考实操考试考什么全国通用 怕考不过白交培训费?唐县电工证怎么报考,这是很多想入行电工行业的人都问过的问题。特别是现在电工证全国通用,很多企业都认这个证,但很多人因为没找对门路,要么交了钱没证,要么考试挂了白忙一场。下面咱们就…

📰

鹿寨去哪考电工证?在这儿找到靠谱考点和报名攻略

鹿寨去哪考电工证?在这儿找到靠谱考点和报名攻略 你是不是正盯着招聘信息,看到“持证上岗”四个字就发愁?现在几乎每个电工岗位都要求有 低压电工证或高压电工证 ,没有证连面试资格都没有。别急,本文就带你搞清楚 鹿寨去哪考电工证…

📰

电工证剧情值不值得考?学历不高怕报不上名?多少钱都得算清楚

电工证剧情值不值得考?学历不高怕报不上名?多少钱都得算清楚 你是不是也在犹豫,自己学历不高,能不能报上电工证?是不是担心报名流程太复杂,或者怕钱花了白费?别急,我来给你捋清楚,从 电工证剧情 的来龙去脉到 多少钱…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬