/*
* zombie.c
*
* Created on: 2011-11-9
* Author: lc
*/
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <stdlib.h>
//产生一个zombie进程
//原因:子进程先于父进程退出,但是,父进程没有调用wait函数接受子进程退出状态,
//导致子进程成为了一个僵尸进程---即,只在进程资源表中占位,已经被杀死了
//父进程的退出也会导致僵尸子进程的退出
//预防方法:
// wait(子进程先于父进程退出)
// 托管 (父进程先于子进程退出,子进程被init接管)
int main(int argc, char **argv) {
pid_t id;
if ((id = fork()) < 0) {
perror("fork");
} else if (id == 0) {
printf("child process [%d]\n",getpid());
exit(0);
}
else {
//wait();
printf("parent process [%d]\n",getpid());
sleep(60);
}
return 0;
}
使用父进程退出方式预防僵尸进程(让init托管子进程)
/* * zombie2.c * * Created on: 2011-11-9 * Author: lc */ #include <stdio.h> #include <unistd.h> #include <stdlib.h> #include <sys/types.h> #include <sys/wait.h> /* * 托管法预防僵尸进程: * 使用两次fork,产生两个子进程 p1 p2 ,p1 是p2 的父进程 * 使 p1退出,p2就被init进程托管 * 无需在父进程中wait p2的退出,p2 也不会成为僵尸进程 * */ int main(int argc, char **argv) { pid_t id1, id2; if ((id1 = fork()) < 0) { perror("fork1"); } else if (id1 == 0) { printf("child1 [%d]\n", getpid()); if ((id2 = fork()) < 0) { perror("fork2"); } else if (id2 == 0) { printf("child2 [%d]\n", getpid()); sleep(30); exit(0); } else { exit(0); } } else { printf("parent [%d]\n",getpid()); waitpid(id1, NULL, 0); exit(0); } return 0; }