孤儿进程:一个父进程退出,而它的一个或多个子进程还在运行,那么那些子进程将成为孤儿进程。孤儿进程将被init进程即1号进程收养,并由init进程进行管理。
僵尸进城:如果子进程退出,而父进程并没有调用wait或waitpid获取子进程的状态信息。这种进程称之为僵死进程。
我们通过代码实现并且查看着两个进程
孤儿进程:
#include<stdio.h>
#include<stdlib.h>
int main()
{
pid_t id=fork();
if(id>0)
{
sleep(1);
printf("father:%d,%d\n",getpid(),getppid());
}
else if(id==0)
{
sleep(6);
printf("child:%d,%d\n",getpid(),getppid());
exit(0);
}
else
{
perror("fork");
}
return 0;
}
![](https://i-blog.csdnimg.cn/blog_migrate/ce7befcef498f5316ba07d396ab3968e.png)
僵尸进程:
#include<unistd.h>
#include<stdio.h>
#include <errno.h>
#include <stdlib.h>
int main()
{
pid_t pid;
pid = fork();
if (pid <0)
{
perror("fork error:");
exit(1);
}
else if (pid == 0)
{
printf("I am child process.I am exiting.[%d][%d]\n",getpid(),\
getppid());
exit(0);
}
printf("I am father process.[%d]\n",getpid());
//等待子进程先退出
sleep(2);
//输出进程信息
system("ps -o pid,ppid,state,tty,command");
printf("father process is exiting.\n");
return 0;
}
如果进程不调用wait / waitpid的话, 那么保留的那段信息就不会释放,其进程号就会一直被占用,但是系统所能使用的进程号是有限的,如果大量的产生僵死进程,将因为没有可用的进程号和进程资源而导致系统不能产生新的进程. 此即为僵尸进程的危害,应当避免。
孤儿进程是没有父进程的进程,孤儿进程这个重任就落到了init进程身上,init进程就好像是一个孤儿院,专门负责处理孤儿进程的善后工作。每当出现一个孤儿进程的时候,内核就把孤 儿进程的父进程设置为init,而init进程会循环地wait()它的已经退出的子进程。这样,当一个孤儿进程凄凉地结束了其生命周期的时候,init进程就会代表党和政府出面处理它的一切善后工作。因此孤儿进程并不会有什么危害。
4.解决方法
(1)通过信号机制
子进程退出时向父进程发送SIGCHILD信号,父进程处理SIGCHILD信号。在信号处理函数中调用wait进行处理僵尸进程。
(2)fork两次原理是将子进程成为孤儿进程,从而其的父进程变为init进程,通过init进程可以处理僵尸进程。