小工具知识网

当前位置: 首页 > 行业知识 > 浅谈 Linux 孤儿进程和僵尸进程

行业知识

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

2026-10-31 00:19:48 来源:互联网转载

文章目录

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

    前言

    本文介绍 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;}

    当运行 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;}

    程序执行后:

    ps ajx 查看进程状态:

    Z+ 就表示僵尸进程。

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

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

上一篇:服务器不让下软件怎么解决?

下一篇:pubg怎么换服务器?