生成僵尸进程

僵尸进程剖析
本文通过一个简单的C语言示例程序详细解析了在UNIX系统中僵尸进程的产生原理及生命周期。介绍了如何通过父进程未正确处理子进程退出状态导致子进程成为僵尸进程的现象,并展示了如何在系统中观察到这些僵尸进程。

定义:

In UNIX System terminology, a process that has terminated,but whose parent has not yet waited for it, is called a zombie. 在UNIX 系统中,一个进程结束了,但是他的父进程没有等待(调用wait / waitpid)他, 那么他将变成一个僵尸进程. 但是如果该进程的父进程已经先结束了,那么该进程就不会变成僵尸进程, 因为每个进程结束的时候,系统都会扫描当前系统中所运行的所有进程, 看有没有哪个进程是刚刚结束的这个进程的子进程,如果是的话,就由Init 来接管他,成为他的父进程

 

 

那就来看看,怎么样能够产生这种进程吧。

 

#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>

int main()
{
    pid_t pid;
    int   i;
    pid = fork();
    if (pid == 0)
    {
        printf("Child Process:/n");
        printf("pid:  %d/n", getpid());
        printf("ppid: %d/n", getppid());
        printf("uid:  %d/n", getuid());
        printf("euid: %d/n", geteuid());
        printf("gid:  %d/n", getgid());
        printf("egid: %d/n", getegid());
        return -1;
    }
    else
        printf("Parent Process:/n");
    printf("pid:  %d/n", getpid());
    printf("ppid: %d/n", getppid());
    printf("uid:  %d/n", getuid());
    printf("euid: %d/n", geteuid());
    printf("gid:  %d/n", getgid());
    printf("egid: %d/n", getegid());

    for(i=0; i<10; i++)
        sleep(10);
    return 0;
}

 

这段代码运行结果:

$./test
Child Process:
pid:  8732
ppid: 8731
uid:  500
euid: 500
gid:  514
egid: 514
Parent Process:
pid:  8731
ppid: 14644
uid:  500
euid: 500
gid:  514
egid: 514

 

显示父进程和子进程都运行起来了,但是子进程其实已经退出。

那现在来显示进程状态。

$ps Uwyang | grep test
 7835 ?        Ss     0:01 gvim test.c
 8731 pts/53   S+     0:00 ./test
 8732 pts/53   Z+     0:00 [test] <defunct>

 8734 pts/32   S+     0:00 grep test

 

看到红颜色的就是我们的进程。 父进程还活着,而子进程已经是Z状态了,表示已经是僵尸进程了。

 

过了100秒后,父进程也退出后。

$ps Uwyang | grep test
32093 pts/53   S+     0:00 grep test

 

可以看到,父进程和子进程都没有了。

是init接管了子进程,还是父进程清理了呢?

想了想,还是应该init接管,清理掉的。

因为父进程不知道子进程的信息。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值