孤儿进程和僵尸进程
linux基础
僵尸进程
当进程exit()退出之后,他的父进程没有通过wait()系统调用回收他的进程描述符的信息,该进程会继续停留在系统的进程表中,占用内核资源,这样的进程就是僵尸进程。
#include <unistd.h>
#include <stdio.h>
int main ()
{
/*fpid表示fork函数返回的值,fork会返回两次,
一次是父进程,返回值是子进程的Pid,在子进程会返回0*/
pid_t fpid;
fpid=fork();//fork后会出现两个分支执行下面的代码,一个父进程,一个新的子进程
if (fpid < 0)
printf("fork error!");
else if (fpid == 0) { //
printf("child id is %dn",getpid());
sleep(30);//睡眠30s,在父进程之前退出
printf("child finally...");
}
else { //父进程
printf("parent id is %dn",getpid());
sleep(60);
printf("parend finally...");
}
}
孤儿进程
当一个进程正在运行时,他的父进程忽然退出,此时该进程就是一个孤儿进程。作为一个进程,需要找到一个父进程,否则这种进程在退出之后没人回收他的进程描述符,空耗内存。此时该进程会找到一个父进程,如果自己所在的进程组没人收养,那就作为init进程的子进程。
#include <unistd.h>
#include <stdio.h>
int main ()
{
/*fpid表示fork函数返回的值,fork会返回两次,
一次是父进程,返回值是子进程的Pid,在子进程会返回0*/
pid_t fpid;
fpid=fork();//fork后会出现两个分支执行下面的代码,一个父进程,一个新的子进程
if (fpid < 0)
printf("fork error!");
else if (fpid == 0) { //
printf("child id is %dn",getpid());
sleep(100);
}
else { //父进程
printf("parent id is %dn",getpid());
sleep(30);//睡眠30s,在子进程之前退出
printf("parend finally...");
}
}
处置方式
孤儿进程会由init进程收养作为子进程,所以不会有什么危害;僵尸进程会占用进程号,以及未回收的文件描述符占用空间,如果产生大量的僵尸进程,将会导致系统无法分配进程号,说明父进程的代码编写有问题。
$ ps -aux|grep Z
在理想情况下,可以通过kill命令将进程杀死该进程的父进程来结束僵尸进程。当然也要结合具体场景来对待。