浅谈 Linux 孤儿进程和僵尸进程

文章目录

前言

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

孤儿进程

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

需要注意两点:

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

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

c 复制代码
#include <stdio.h>
#include <unistd.h>

/*
 * 代码实现思路:
 *
 * 前面说过,父进程先于子进程结束,那么子进程就是 孤儿进程。
 * 所以我们只需要让父进程创建出子进程后,父进程就结束,子进程继续运行(例如 让子进程进入死循环)
 */

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;
}

当运行 test 程序后,输出如下结果:

此时 sleep(10) 还没结束,我们快速看看进程信息:

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

等 10 秒后,控制台继续输出:

此时我们再使用 ps 看看进程信息:

可以看到子进程的父进程变成了 1 号进程,确实是被 init 接管了,等子进程自己结束后,init 就是回收它。

该案例是死循环,会一直输出,可以用 kill -9 19186 结束子进程。

僵尸进程

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

需要记住,无法使用 kill 杀死僵尸进程 ,都已经是僵尸了,还怎么杀死?

需要使用 kill 杀死他的父进程,让僵尸进程变成孤儿进程,init 会接管/回收孤儿进程。

每个进程结束后都必然会经历僵尸态,时间长短的差别而已。

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

c 复制代码
#include <stdio.h>
#include <unistd.h>

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;
}

程序执行后:

ps ajx 查看进程状态:

Z+ 就表示僵尸进程。

要么等待父进程空闲出来回收子进程。

要么手动 kill 父进程,让 init 进程回收子进程。

相关推荐
用户8055336980312 小时前
主线 U-Boot 上 RK3506:和闭源 rkbin 拔河的三个隐性契约
linux·嵌入式
用户0340952979113 小时前
linux fcitx 5 雾凇拼音 设置在中文输入法下仍然输入英文标点
linux
乘云数字DATABUFF13 小时前
5分钟部署开源APM Databuff:OpenTelemetry全链路追踪入门实战
运维·后端
Web3探索者2 天前
可视化服务器管理和传统命令行区别是什么?新手教程:Linux 运维到底该用图形界面还是 SSH 命令行?
linux·ssh
zylyehuo2 天前
Linux系统中网线与USB网络共享冲突
linux
荣--2 天前
一键部署不是为了省时间 —— 它是把"买来的 PaaS"变成"自己的平台"的拐点
运维·zabbix·工程化·一键部署·平台化·边界设计
江华森2 天前
动手实战学 Docker — 从零到集群编排完全指南
运维
Avan_菜菜3 天前
FRP 内网穿透完整实战:从 HTTP 映射到 HTTPS 自签代理
运维·nginx·https
Sokach10154 天前
Linux Shell 脚本从零到能用:一个新手的一天学习总结
linux
SelectDB4 天前
Litefuse 开源并推出单进程轻量模式,25 秒就能跑起来的 Agent 可观测与评估平台
运维·后端·自动化运维