你好,游客 登录 注册 搜索
背景:
阅读新闻

Linux 系统中僵尸进程

[日期:2013-10-18] 来源:博客园  作者:hazir [字体: ]

Linux 系统中僵尸进程和现实中僵尸(虽然我也没见过)类似,虽然已经死了,但是由于没人给它们收尸,还能四处走动。僵尸进程指的是那些虽然已经终止的进程,但仍然保留一些信息,等待其父进程为其收尸。


僵尸进程如何产生的?
如果一个进程在其终止的时候,自己就回收所有分配给它的资源,系统就不会产生所谓的僵尸进程了。那么我们说一个进程终止之后,还保留哪些信息?为什么终止之后还需要保留这些信息呢?

一个进程终止的方法很多,进程终止后有些信息对于父进程和内核还是很有用的,例如进程的ID号、进程的退出状态、进程运行的CPU时间等。因此进程在终止时,回收所有内核分配给它的内存、关闭它打开的所有文件等等,但是还会保留以上极少的信息,以供父进程使用。父进程可以使用 wait/waitpid 等系统调用来为子进程收拾,做一些收尾工作。

因此,一个僵尸进程产生的过程是:父进程调用fork创建子进程后,子进程运行直至其终止,它立即从内存中移除,但进程描述符仍然保留在内存中(进程描述符占有极少的内存空间)。子进程的状态变成EXIT_ZOMBIE,并且向父进程发送SIGCHLD 信号,父进程此时应该调用 wait() 系统调用来获取子进程的退出状态以及其它的信息。在 wait 调用之后,僵尸进程就完全从内存中移除。因此一个僵尸存在于其终止到父进程调用 wait 等函数这个时间的间隙,一般很快就消失,但如果编程不合理,父进程从不调用 wait 等系统调用来收集僵尸进程,那么这些进程会一直存在内存中。

在 Linux 下,我们可以使用 ps 等命令查看系统中僵尸进程,僵尸进程的状态标记为‘Z’:


产生一个僵尸进程
根据上面的描述,我们很容易去写一个程序来产生僵尸进程,如下代码:

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

int main()
{
    //fork a child process
    pid_t pid = fork();

    if (pid > 0)  //parent process
    {
        printf("in parent process, sleep for one miniute...zZ...\n");
        sleep(60);
        printf("after sleeping, and exit!\n");
    }
    else if (pid == 0) 
    {
        //child process exit, and to be a zombie process
        printf("in child process, and exit!\n");
        exit(0);
    }

    return 0;
}
父进程并没有写 wait 等系统调用函数,因此在子进程退出之后变成僵尸进程,父进程并没有为其去收尸。我们使用下面命令编译运行该进程,然后查看系统中进程状态:

www.linuxidc.com @linuxidc:~/Documents$ gcc zombie.c -o zombie
www.linuxidc.com @linuxidc:~/Documents$ ./zombie
in parent process, sleep for one miniute...zZ...
in child process, and exit!

更多详情见请继续阅读下一页的精彩内容http://www.linuxidc.com/Linux/2013-10/91567p2.htm

相关阅读

Linux 的僵尸(zombie)进程 http://www.linuxidc.com/Linux/2013-06/86128.htm

Linux下僵尸进程的处理 http://www.linuxidc.com/Linux/2012-08/67219.htm

Linux上的僵尸跑得比Windows快 http://www.linuxidc.com/Linux/2012-08/67148.htm

Linux入门知识:杀死僵尸进程 http://www.linuxidc.com/Linux/2011-08/40879.htm

Linux僵尸进程详细解析及ps常见用法 http://www.linuxidc.com/Linux/2011-11/48005.htm

linux
相关资讯       Linux僵尸进程 
本文评论   查看全部评论 (0)
表情: 表情 姓名: 字数

       

评论声明
  • 尊重网上道德,遵守中华人民共和国的各项有关法律法规
  • 承担一切因您的行为而直接或间接导致的民事或刑事法律责任
  • 本站管理人员有权保留或删除其管辖留言中的任意内容
  • 本站有权在网站内转载或引用您的评论
  • 参与本评论即表明您已经阅读并接受上述条款