一、僵尸进程
定义:僵尸进程是子进程先于父进程结束,此时没有回收子进程,释放子进程占用的资源,此时子进程就叫做僵尸进程,僵尸外文名叫:zombie,因此僵尸进程在Linux状态下简称Z
如果这时父进程结束了, 那么init进程自动会接手这个子进程,为它收尸,它还是能被清除的。但是如果如果父进程是一个循环,不会结束,那么子进程就会一直保持僵尸状态。
僵尸进程的实现
- 实现僵尸进程我们只需要在代码中创建两个进程,让子进程退出,父进程循环输出,来达到目的。
#include<stdio.h>
#include<unistd.h>
int main()
{
pid_t ret=fork();//创建子进程
if(ret<0)
{
return 0;
}
else if(ret==0)
{
printf("I am child,pid is:%d\n",getpid());
printf("My father pid is:%d\n",getppid());
}
else
{
while(1)
{
printf("I am father,pid is %d\n",getpid());
printf("My father pid is:%d\n",getppid());
sleep(1);
}
}
return 0;
}
让程序运行起来之后我们分析父子进程:
1. 父进程PID为:20518
2. 子进程PID为:20520
我们使用指令 ps aux | grep main 来查看父进程与子进程的信息会发现子进程已经变成了Z
僵尸进程的危害
- 僵尸进程会占用系统资源,如果有很多僵尸进程,就会没有可用的进程号导致系统不能创建新进程
如何处理僵尸进程
使用命令 kill -9 [pid]
孤儿进程
一个父进程退出,而它的一个或多个子进程还在运行,那么那些子进程将成为孤儿进程。孤儿进程将被init进程(进程号为1)所收养,并由init进程对它们完成状态收集工作。孤儿进程是没有父进程的进程。每当出现一个孤儿进程的时候,内核就把孤儿进程的父进程设置为init,而init进程会循环地wait()它的已经退出的子进程。这样,当一个孤儿进程凄凉地结束了其生命周期的时候,init进程就会代表党和政府出面处理它的一切善后工作。因此孤儿进程并不会有什么危害
创建一个孤儿进程:让子进程陷入循环,父进程先退出
#include<stdio.h>
#include<unistd.h>
int main()
{
pid_t ret=fork();
if(ret<0)
{
return 0;
}
else if(ret==0)
{
while(1)
{
printf("I am child,pid is:%d\n",getpid());
printf("my father pid is:%d\n",getppid());
sleep(1);
}
}
else
{
printf("I am father,pid is:%d\n",getpid());
printf("my father pid is:%d\n",getppid());
}
return 0;
}
我们可以看到这个孤儿进程已经被一号进程领养。