在fork()/execve()过程中,假设子进程结束时父进程仍存在,而父进程fork()之前既没安装SIGCHLD信号处理函数调用waitpid()等待子进程结束,又没有显式忽略该信号,子进程则成为僵尸进程,无法正常结束,
此时即使是root身份kill
-9也不能杀死僵尸进程。补救办法是杀死僵尸进程的父进程(僵尸进程的父进程必然存在),僵尸进程成为"孤儿进程",过继给1号进程init,init始终会负责清理僵尸进程。
产生僵尸进程:
int main(void)
{
pid_t pid;
if((pid = fork()) < 0)
{
printf("fork error");
}else if(pid == 0)
{
exit(0);
}
system("ps|grep defunct|grep -v grep");
exit(0);
}
{
pid_t pid;
if((pid = fork()) < 0)
{
printf("fork error");
}else if(pid == 0)
{
exit(0);
}
system("ps|grep defunct|grep -v grep");
exit(0);
}