• 浅谈 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 进程回收子进程。

  • 相关阅读:
    如何自动生成一本epub电子书
    【Java】文件操作篇(四)序列化与对象处理流
    C++中模板类对象创建
    Java反射详解篇--一篇入魂
    在VS2015中安装Qt环境
    leetcode 374. Guess Number Higher or Lower(猜数字)
    为什么要选择AWS?AWS的优势有哪些?
    ③、企业快速开发平台Spring Cloud之HTML 属性
    # Python基础:输入输出详解-读写文件(还需完善)
    JSON&redis
  • 原文地址:https://blog.csdn.net/weixin_45112150/article/details/136405790