产生原因
当子进程退出时,父进程没有调用wait函数或者waitpid()函数等待子进程结束,又没有显式忽略SIGCHLD信号,那么它将一直保持在僵尸状态,如果这时父进程结束了,init进程会自动接收这个子进程,为它收尸,但如果父进程是一个循环,不会结束,那么子进程就会一直保持僵死状态。
测试代码
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <string.h>
int main(int argc, const char* argv[])
{
pid_t pid;
pid = fork();
if(pid == -1)
{
perror("fork error");
exit(1);
}
//当子进程退出时,父进程没有调用wait函数或者waitpid()函数等待子进程结束,又没
//有显式忽略SIGCHLD信号,那么它将一直保持在僵尸状态,如果这时父进程结束了,
//init进程会自动接收这个子进程,为它收尸,但如果父进程是一个循环,不会结束,
//那么子进程就会一直保持僵死状态。
if(pid > 0)
{
while(1)
{
printf("i am parent process, pid = %d, ppid = %d\n", getpid(), getppid());
sleep(1);
}
}
else if(pid == 0)
{
printf("i am child process, pid = %d, ppid = %d\n", getpid(), getppid());
sleep(1);
}
for(int i=0; i<5; ++i)
{
printf("i = %d\n", i);
}
return 0;
}
测试结果