1、概念
僵尸进程指的是处于僵尸态的进程,这种进程无法进行调度,但其所占用的系统资源并未被释放。僵尸态是进程生命周期的必经阶段,是无法避免的,但为了节约系统资源,应尽快清理腾出僵尸态进程所占用的内存资源。
2、产生的原因
当一个程序的代码流程从main函数返回后,进程就结束了,但此时不能立即退出,因为还需要向其父进程汇报执行的结果和死亡的原因,又因为已无法被调度,因此进程只能以一种被动的姿态躺倒,等待其创建者(父进程)前来获取其执行结果和死亡原因。
通过下列程序可查看僵尸进程:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
int main(int argc,char *argv[])
{
pid_t pid=fork();
if (pid==0)
{
printf("子进程\n");
//子进程退出变僵尸
return 0;
}
else
{
//父进程不退出
pause();
}
return 0;
}
结果:
使用命令:ps ajx 查看进程状态
3、释放僵尸态
- 父进程直接退出
-
子进程等待父进程对其执行wait()/waitpid()
释放对应僵尸子进程的系统资源
获取对应僵尸子进程的退出状态
阻塞父进程(可选)
示例代码:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
int main(int argc,char *argv[])
{
pid_t pid=fork();
if (pid==0)
{
printf("子进程\n");
return 0;
}
else
{
wait(NULL); //父进程调用wait()释放子进程资源
pause();
exit(0);
}
return 0;
}