码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 浅谈 Linux 孤儿进程和僵尸进程


    文章目录

    • 前言
    • 孤儿进程
    • 僵尸进程

    前言

    本文介绍 Linux 中的 孤儿进程 和 僵尸进程。

    孤儿进程

    在 Linux 中,就是父进程已经结束了,但是子进程还在运行,这个子进程就被称作 孤儿进程。

    需要注意两点:

    1. 孤儿进程最终会进入孤儿院,也就是被 init 进程接管,子进程死亡后会被 init 进程回收。
    2. 孤儿进程可以使用 kill -9 结束其运行。

    代码演示:产生一个孤儿进程

    #include 
    #include 
    
    /*
     * 代码实现思路:
     *
     * 前面说过,父进程先于子进程结束,那么子进程就是 孤儿进程。
     * 所以我们只需要让父进程创建出子进程后,父进程就结束,子进程继续运行(例如 让子进程进入死循环)
     */
    
    int main() {
    
            int pid;
    
            pid = fork();
    
            if(pid == 0) {
                    // 这是子进程
                    while(1){
                            printf("我是子进程 id: %d, 我进入了死循环...\n", getpid());
                            sleep(2);
                    }
            } else if(pid > 0) {
                    // 这段时间让我们用 ps 看看父进程结束前的进程信息
                    sleep(10);
                    printf("我是父进程, id: %d  没事我先挂了\n", getpid());
            }
            return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29

    当运行 test 程序后,输出如下结果:
    在这里插入图片描述

    此时 sleep(10) 还没结束,我们快速看看进程信息:
    在这里插入图片描述

    可以看到父进程是 19185,子进程是 19186.

    等 10 秒后,控制台继续输出:
    在这里插入图片描述

    此时我们再使用 ps 看看进程信息:
    在这里插入图片描述
    可以看到子进程的父进程变成了 1 号进程,确实是被 init 接管了,等子进程自己结束后,init 就是回收它。
    该案例是死循环,会一直输出,可以用 kill -9 19186 结束子进程。

    僵尸进程

    概念:子进程结束了,由于父进程很忙,没时间回收子进程,那么子进程就成了 僵尸进程。

    需要记住,无法使用 kill 杀死僵尸进程,都已经是僵尸了,还怎么杀死?
    需要使用 kill 杀死他的父进程,让僵尸进程变成孤儿进程,init 会接管/回收孤儿进程。
    每个进程结束后都必然会经历僵尸态,时间长短的差别而已。

    代码演示:实现一个僵尸进程

    #include 
    #include 
    
    int main() {
    
            int pid;
    
            pid = fork();
    
            if(pid == 0) {
                    // 这是子进程
                    printf("我是子进程 id: %d, 我先挂了\n", getpid());
            } else if(pid > 0) {
                    printf("我是父进程, id: %d  我在 sleep, 我很忙...\n", getpid());
                    sleep(100);
            }
            return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    程序执行后:
    在这里插入图片描述
    ps ajx 查看进程状态:
    在这里插入图片描述
    Z+ 就表示僵尸进程。

    要么等待父进程空闲出来回收子进程。
    要么手动 kill 父进程,让 init 进程回收子进程。

  • 相关阅读:
    .NET MAUI – 一个代码库,多个平台
    一次关于引入自定义JAR包JDK版本问题总结
    Linux系统安全 非活跃会话自动断开连接机制
    LeetCode50天刷题计划(Day 11—— 最接近的三数之和(8.40-10.00)
    中小企业怎么去挑选ERP系统?
    Java内存模型(Java Memory Molde,JMM)
    【SA8295P 源码分析 (三)】132 - GMSL2 协议分析 之 GPIO/SPI/I2C/UART 等通迅控制协议带宽消耗计算
    一种朴素的消失点计算方法
    WorkPlus AI助理知识问答机器人,助力企业级私有化AI构建
    Windows下IntelliJ IDEA远程连接服务器中Hadoop运行WordCount(详细版)
  • 原文地址:https://blog.csdn.net/weixin_45112150/article/details/136405790
  • 最新文章
  • 沪漂五周年了:我越来越迷茫了
    Agentic Skill Routing 实战:别再把所有 Skill 塞进 AI Agent 上下文
    MySQL-Seconds_behind_master的精度误差
    [MAF预定义ChatClient中间件-03]CachingChatClient——利用缓存省钱省时间
    AI的至暗历史:从万众期待到被政府撤资,AI的两次死亡徘徊
    Agent OS :五种驯服不确定性的范式
    PortSwigger SQL注入LAB11
    数据库即时编译JIT
    [Begin]AI Learn Data Day 0
    深度学习进阶(二十七)现代 LLM 的核心架构设计其二:SwiGLU
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
小工具 小游戏
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1

京公网安备 11010502049817号