僵尸进程即为进程已经执行完毕,但是其父进程没有调用wait/waitpid,则该进程将变成一个僵尸进程,虽然没有执行,但占用系统中的一个PCB空间。僵尸进程多的话,可以将系统卡死。
僵尸进程的实现为:使用folk创建一个子进程,让子进程进来之后很快就退出,父进程什么也不做,即没有调用wait/waitpid,所以该子进程就成为了一个僵尸进程。
int main()
{
pit_t id=folk();//folk返回两个值,给父进程返回子进程的pid,给子进程返回0,所以返回0表示子进程创建成功。
if(id == 0)
{
printf("this is child process\n");
exit(1);
}
else
sleep(1000);
return 0;
}
然后我们可以用ps -ef查看是否有僵尸进程存在。
在另一个终端使用ps -ef查看。defunct为僵尸进程的标志。
僵尸进程的结束方法:
1.>ps -aux:然后在里面找
2.>ps -A | grep defunct:直接显示僵尸进程
发现系统中有一个Zombie的僵尸进程。
再查看就是进程的uid,pid等信息。
$ ps -ef | grep defunct | more
最后使用kill -9 ppid杀死僵尸进程的父进程,将僵尸进程变为一个孤儿进程,被init进程接收,然后被init进程处理掉。
ok,僵尸进程顺利被杀死。
孤儿进程:
父进程创建一个子进程后,父进程退出,留下一个子进程还在运行,则称之为孤儿进程。孤儿进程会被init进程领养。
int main()
{
pid_t id=folk();
if(id!=0)
{
printf("father pid:%d, father ppid:%d\n"getpid(),getppid());
exit(1);
}
else
{
while(1)
printf("child pid:%d, child ppid:%d\n",getpid(),getppid());
}
return 0;
}
我们在用folk创建出一个子进程后,就让父进程退出,此时只留下一个还在执行的子进程,不停的打印自己的pid和ppid,他就是孤儿进程。
我们可以发现这个子进程的ppid为1,即表示这个子进程的父进程为1号进程,也就是init进程。表示:当创建出来的这个孤儿进程编程孤儿进程后,就有init进程“领养”。
|