版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_27312943/article/details/79104209
1 僵尸进程概述
2 僵尸进程产生的条件
3 如何避免僵尸进程
僵尸进程产生的原因是系统保留了终止进程的状态信息以便于让父进程获得,而父进程在子进程结束之后没有及时回收资源,因此想要避免僵尸进程只需要让父进程及时”收尸“即可。wait()和waitpid()函数,不仅可以获得子进程的返回状态,更重要的是可以回收子进程的资源,也能有效的避免僵尸进程。
一个可行的办法是使用异步的方法对进程资源进行回收。
4 实例
/*avoid_zombiel.c*/
//使用信号机制异步回收资源,避免僵尸进程的产生
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <signal.h>
/*信号处理函数,每当进程收到SIGCHLD信号时触发这个函数*/
void sigchld_handler(int sign_no)
{
if(sign_no == SIGCHLD)
{
/*回收资源*/
wait(NULL);
puts("SIGCHLD received\n");
}
}
int main()
{
pid_t pid;
/*使用signal()函数为SIGCHLD信号绑定一个信号处理函数*/
/*SIGCHLD子进程改变状态时,父进程会接受到这个信号*/
if( SIG_ERR==signal(SIGCHLD,sigchld_handler) )
{
printf("signal\n");
return -1;
}
/*创建子进程*/
pid=fork();
if(pid < 0)
{
/*子进程创建失败,直接返回*/
printf("error fork\n");
exit(1);
}
else if(pid == 0)
{
/*是子进程,睡眠3秒之后结束*/
printf("i am child \n");
sleep(3);
exit(EXIT_SUCCESS);
}
else
{
/*是父进程,正常运行,打印字符串*/
while(1)
{
printf("i am father!\n");
sleep(1);
}
}
}
运行结果
子进程在延时3秒后结束,父进程通过信号处理函数来回收子进程的资源