生成僵尸进程

来源:互联网 发布:汽车电脑编程叫什么 编辑:程序博客网 时间:2024/04/30 10:29

定义:

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接管,清理掉的。

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

原创粉丝点击