僵尸进程概念以及处理方式

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/YL970302/article/details/89603424

一、僵死进程的概念

子进程先于父进程结束,而父进程又没有调用wait或者waitpid获取其退出信息。子进程还需要在其PCB中保存其退出的相关信息,所以,子进程的执行主体已经结束,但是操作系统并没有释放该进程PCB结构,以满足父进程后续对该子进程退出信息的查询(如果父进程还在运行)。在子进程结束运行之后,父进程读取其退出状态之前,我们称该子进程为僵尸进程

二、处理方式                              

由父进程调用wait或者waitpid获取其退出信息,但是调用wait或者waitpid的进程会阻塞运行,导致父进程在子进程结束之前不能执行其他事情。在此基础之上可用两种方式解决

(1)利用信号SIGCHLD,子进程状态改变后会向其父进程发送SIGCHLD信号。父进程在接受到该信号后,在信号处理函数中调用wait或者waitpid。

(2)fork两次,将最终使用的子进程变为孤儿进程,从而交由init进程处理其退出信息

三、孤儿进程

  父进程结束或者异常终止,但是子进程继续运行。此时子进程的PPID被设置为1,即init进程。init进程接管了该子进程,并等待它结束,在父进程退出之后,子进程退出之前,该子进程属于孤儿进程(在Linux高性能服务器编程中也被称为僵尸进程)

四、僵尸进程和孤儿进程会造成什么?

无论哪种情况,如果父进程没有正确的处理子进程的返回信息,子进程都将停留在僵尸态或者孤儿态,并占据着内核资源。这是不允许的,毕竟内核资源有限。

 

猜你喜欢

转载自blog.csdn.net/YL970302/article/details/89603424
今日推荐