首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 操作系统 > UNIXLINUX >

Linux 系统中僵尸过程

2013-10-18 
Linux 系统中僵尸进程Linux 系统中僵尸进程和现实中僵尸(虽然我也没见过)类,虽然已经死了,但是由于没人给

Linux 系统中僵尸进程

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

僵尸进程如何产生的?

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

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

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

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

产生一个僵尸进程

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

#include <stdio.h>#include <sys/types.h>int main//fork a child process    pid_t = if > 0//parent process    "in parent process, sleep for one miniute...zZ...\n"60"after sleeping, and exit!\n"else if == 0//child process exit, and to be a zombie process        "in child process, and exit!\n"0return 0
#include <stdio.h>#include <signal.h>#include <string.h>#include <sys/types.h>#include <sys/wait.h>sig_atomic_t void clean_up_child_processint /* clean up child process */    int &/* store its exit status in a global variable */    = int main/* handle SIGCHLD by calling clean_up_child_process  */    struct &0sizeof= &&NULL/* fork a child, and let the child process dies before parent */    pid_t = if > 0"in parent process, and sleep for on mininute...zZ...\n"60else if== 0"in child process, and exit now\n"0else    "fork failed!\n"return 0;}   

参考资料
    http://en.wikipedia.org/wiki/Zombie_processhttp://simplestcodings.blogspot.com/2010/10/story-of-zombie-process.htmlhttp://www.howtogeek.com/119815/
    1楼lanxuezaipiao32分钟前
    我来顶一下

热点排行