僵尸进程的产生原因
来源:互联网 发布:单片机flash存储器 编辑:程序博客网 时间:2024/04/30 21:13
在Linux系统中,僵尸进程是已经执行完毕,但是没有被父进程回收的子进程。判断僵尸进程的一个方法是使用ps命令查看进程状态。如果进程状态是Z,说明这是一个僵尸进程。
在多进程的程序中,父进程会启动若干个子进程来处理任务。当子进程退出后,除了在进程表中占用的一个进程表项,子进程所使用的资源(文件描述符、内存等)都会被释放。保留子进程的进程表项,是为了把子进程的执行结果告诉给父进程。父进程调用waitpid()来得到子进程的执行结果。
如果子进程执行完毕,而父进程没有退出,也没有调用waitpid()来得到子进程的执行结果,这时,子进程已经不存在了,却还占用着一个进程表项。这样的进程叫做僵尸进程。当父进程调用waitpid()后,僵尸进程占用的进程表项被释放,僵尸进程彻底消失。
如果父进程在调用waitpid前退出,子进程(包括僵尸进程)的父进程会变为init进程。由init进程负责回收子进程,所以不会产生僵尸进程。
僵尸进程消耗的唯一资源是进程表项。也就是说,如果产生了大量的僵尸进程占满了进程表,系统将无法创建新的进程。除此之外,僵尸进程不会对系统造成影响。
僵尸进程不能使用kill来杀死。因为僵尸进程已经执行完毕了,无法杀死。要消除僵尸进程,方法是找到父进程,杀死父进程。这时僵尸进程会由init收回。
下面是一个展示僵尸进程产生原因的例子。
/* 展示Linux系统中僵尸进程的产生原因。 */#include <stdio.h>#include <stdlib.h>#include <unistd.h>#include <sys/types.h>int main(void){ pid_t pid; if ((pid = fork()) < 0){ perror(""); exit(0); } else if (pid == 0){ exit(0); } else { char ch; char buffer[1024]; int status; printf("See the zombie process?\n"); printf("child process pid: %d\n", pid); sprintf(buffer, "ps -ef | grep %d\0", pid); printf("execute '%s'\n", buffer); system(buffer); waitpid(pid, &status, 0); printf("It's gone.\n"); printf("execute '%s'\n", buffer); printf("child process (%d) exited with status: %d\n", pid, status); system(buffer); } return 0;}
- 僵尸进程的产生原因
- 僵尸进程的产生原因
- linux僵尸进程产生的原因以及如何避免产生僵尸进程
- linux僵尸进程产生的原因以及如何避免产生僵尸进程
- linux僵尸进程产生的原因以及如何避免产生僵尸进程
- linux僵尸进程产生的原因以及如何避免产生僵尸进程
- linux僵尸进程产生的原因以及如何避免产生僵尸进程
- 关于linux的僵尸进程的产生原因的分析
- 僵尸进程的产生
- 僵尸进程产生的原因及如何避免
- 僵尸进程的产生原因和避免方法
- 僵尸进程的产生原因和避免方法
- Linux的僵尸进程产生原因及解决方法
- linux僵尸进程产生的原因以及如何避免产生僵尸进程(waitpid应对多进程的情况)
- 僵尸进程的原因
- 防止僵尸进程的产生
- 僵尸进程如何产生的
- linux下的僵尸进程产生原因和解决方法(含具体代码)
- 图解VMware内存机制(VMware的重要知识)
- jquery DOM操作
- shell if
- jdk 配置 环境变量设置
- Ubuntu 12.4上实现XRDP远程桌面访问Ubuntu
- 僵尸进程的产生原因
- 二维数组保存下标的好处
- C实现简单单向链表,一次遍历查找倒数第k个节点的值
- 哈佛大学凌晨4点半的景象
- iOS7适配状态栏(StatusBar)
- VMware内存分配初探
- MyISAM InnoDB 区别
- TCP/IP-------unix文件描述符-8
- SMTP验证方式种类(LOGIN、PLAIN、CRAM-MD5)