先给出一个会产生僵尸进程的程序,运行后观察结果.
#include<stdio.h>
#include<stdlib.h>
#include<sys/types.h>
#include<sys/wait.h>
int main()
{
int pid;
pid = fork();
if(pid > 0)//father process
{
int i = 1;
while(i <= 12)
{
sleep(1);
i += 1;
}
}
else if(pid == 0)//son process
{
int j = 1;
while(j <= 4)
{
sleep(1);
j += 1;
}
exit(0);
}
return 0;
}
通过结果可以清晰地看出,当大约4s后子进程结束,此时父进程还有大约8s的时间才能结束,这就导致在4 ~ 12s间,子进程成为僵尸进程.
下面的程序是基于上面改造的,即运用两次fork()来避免僵尸进程的出现.
#include<stdio.h>
#include<stdlib.h>
#include<sys/types.h>
#include<sys/wait.h>
int main()
{
int pid;
pid = fork();
if(pid > 0)//father process
{
wait(0);//waiting for the end of son process
int j = 1;
while(j <= 12)
{
sleep(1);
j ++;
}
}
else if(pid == 0)//son process
{
int pid2;
pid2 = fork();
if(pid2 > 0)//son process
{
exit(0);
}
else if(pid2 == 0)//grandson process
{
int i = 1;
while(i <= 4)
{
sleep(1);
i ++;
}
exit(0);
}
}
return 0;
}