linux操作系统之进程 僵尸进程和孤儿进程

原创 2018年04月17日 19:55:22

孤儿进程
孤儿进程: 父进程先于子进程结束,则子进程成为孤儿进程,子进程的父进程成为init进程,称为init进程领养孤儿进程。

#include<stdlib.h>
#include<stdio.h>
#include<unistd.h>

int main()
{
        pid_t pid;

        pid = fork();

        if(pid==-1)
        {
                perror("fork:");
                exit(1);
        }
        else if(pid>0)
        {
                sleep(1);//
                printf("i am parant.\n");
        }
        else
        {

                printf("i am child.pid=%ld,ppid=%ld\n",getpid(),getppid());
                sleep(3);
                printf("i am child.pid=%ld,ppid=%ld\n",getpid(),getppid());
        }
        return 0;
    }

打印结果,发现父进程先结束,子进程后结束,子进程的父进程改变了。:
[root@FOSDEV test2]# ./orphan
i am child.pid=423,ppid=422
i am parant.
[root@FOSDEV test2]# i am child.pid=423,ppid=1

僵尸进程
僵尸进程: 进程终止,父进程尚未回收,子进程残留资源(PCB)存放于内核中,变成僵尸(Zombie)进程。
【zoom .c】
特别注意,僵尸进程是不能使用kill命令清除掉的。因为kill命令只是用来终止进程的,而僵尸进程已经终止。思考!用什么办法可清除掉僵尸进程呢?

设计一个僵尸进程:

#include<stdlib.h>
#include<stdio.h>
#include<unistd.h>
int main()
{
    pid_t pid;
    pid =  fork();
    if(pid == -1)
    {
            perror("fork:");
            exit(1);
    }
    if(pid == 0)
    {
            printf("i am child .pid = %ld,ppid = %ld\n",getpid(),getppid());
            sleep(10);
            printf("child did.\n");
    }
    else if(pid > 0)
    {
            sleep(1);
            while(1)
            {
                   printf("i am parent. pid = %d,myson= %ld\n",getpid(),pid);
                   sleep(1);
            }
    }
    return 0;

}

打印结果,子进程已经运行结束,但父进程并没有回收子进程。
[root@FOSDEV test2]# ./zombie
i am child .pid = 482,ppid = 481
i am parent. pid = 481,myson= 482
i am parent. pid = 481,myson= 482
i am parent. pid = 481,myson= 482
i am parent. pid = 481,myson= 482
i am parent. pid = 481,myson= 482
i am parent. pid = 481,myson= 482
i am parent. pid = 481,myson= 482
i am parent. pid = 481,myson= 482
i am parent. pid = 481,myson= 482
child did.
i am parent. pid = 481,myson= 482
i am parent. pid = 481,myson= 482
i am parent. pid = 481,myson= 482
i am parent. pid = 481,myson= 482
i am parent. pid = 481,myson= 482
……

孤儿进程、僵尸进程、守护进程

孤儿进程:一个父进程退出,而它的一个或多个子进程还在运行,那么那些子进程将成为孤儿进程。孤儿进程将被init进程(进程号为1)所收养,并由init进程对它们完成状态收集工作。僵尸进程:一个进程使用fo...
  • yuanlairuci1992
  • yuanlairuci1992
  • 2016-08-04 19:58:50
  • 1033

各种进程 守护进程 孤儿进程 僵尸进程

一些Linux应用程序中出现两次fork的解释一个进程使用fork创建子进程,如果子进程退出,而父进程并没有调用wait或waitpid获取子进程的状态信息,那么子进程的进程描述符仍然保存在系统中。这...
  • ssky87
  • ssky87
  • 2010-10-08 16:52:00
  • 1945

linux c之孤儿进程与僵尸进程[总结]

转载地址:http://www.cnblogs.com/Anker/p/3271773.html 1、前言   之前在看《unix环境高级编程》第八章进程时候,提到孤儿进程和僵尸进程,一直对这...
  • u011068702
  • u011068702
  • 2017-01-17 21:01:44
  • 383

模拟实现~僵尸进程和孤儿进程

僵尸进程首先说一下,什么是僵尸进程呢?当进程退出并且父进程(使用wait()系统调用)没有读取到子进程退出的返回代码时就会产生僵尸进程。僵尸进程会以终止状态保持在进程表中,并且会一直在等待父进程读取退...
  • jhcconan614
  • jhcconan614
  • 2017-04-27 16:40:51
  • 422

zombie僵尸进程、孤儿进程和守护进程

以前一直对僵尸进程和孤儿进程都没怎么理解,真是罪过,最近在看liunx编程设计(第四版),看到了他们的概念,所以对它们做个总结!加深印象。 基本概念: 我们知道在unix...
  • gogoky
  • gogoky
  • 2016-05-07 22:17:26
  • 3721

孤儿进程与僵尸进程的理解

题目: 下面有关孤儿进程和僵尸进程的描述,说法错误的是? 正确答案: D   你的答案: C (错误) 孤儿进程:一个父进程退出,而它的一个或多个子进程还在运行,那么那些子进程将成为孤儿进程。 僵尸进...
  • u012496940
  • u012496940
  • 2015-09-21 16:00:54
  • 509

僵尸进程与孤儿进程模拟实现

背景知识 僵尸进程(Zombies): (1)僵尸进程是一个比较特殊的状态,当进程退出父进程(使用wait()系统调用)没有没有读取到子进程退出的返回代码时就会产生僵尸进程。僵尸进程会在以终止状态...
  • double_happiness
  • double_happiness
  • 2017-04-14 11:18:12
  • 801

进程的一些概念-父亲进程、子进程、僵尸进程、孤儿进程

进程有这么多的种类,那么进程之间定是有相关性的,而这些有关联性的进程又是如何产生的,如何衍生的? 就比如我们启动了终端,就是启动了一个 bash 进程,我们可以在 bash 中再输入 bash ...
  • qq_32437319
  • qq_32437319
  • 2016-12-05 17:02:43
  • 167

僵尸进程,孤儿进程

一、定义,什么是僵尸进程、孤儿进程
  • ljthdu
  • ljthdu
  • 2014-07-29 08:55:43
  • 896

paip.杀不死进程的原因--僵尸进程的解决.txt

paip.杀不死进程的原因--僵尸进程的解决.txt 作者Attilax  艾龙,  EMAIL:1466519819@qq.com 来源:attilax的专栏 地址:http://b...
  • attilax
  • attilax
  • 2013-12-12 22:27:01
  • 2002
收藏助手
不良信息举报
您举报文章:linux操作系统之进程 僵尸进程和孤儿进程
举报原因:
原因补充:

(最多只允许输入30个字)