概念
僵尸进程,Linux中记为 Z
是进程运行时可能会出现的有一种状态,其是当进程退出时父进程本没有读取到子进程退出的返回代码,也就是说,子进程先于父进程结束,而父进程并没有回收子进程,进行占用资源的释放,这个时候该进程便成为了僵尸态。
表现
当僵尸进程产生之后,该进程便会以终止状态保持在进程表中,并且会一直等待父进程读取退出状态代码。
僵尸进程的危害
- 僵尸进程出现后必会有子进程以终止状态保持,不上不下的。
- 占用资源,产生内存泄漏
- 每一个内核创造进程的数量是有一定的,处于僵尸态的进程不进行回收会占用进程位
僵尸进程的处理及避免
- 进行两次fork()
父进程进行一次fork之后继续执行,将产生的子进程再一次fork产生孙进程,将子进程使用exit正常退出后,孙进程便会被init进程收留接管从而避免僵尸进程产生。
- 调用wait()或者waitpid()函数
当父进程调用到wait()时,对自己进行阻塞,寻找是否有已经完成的子进程,若有,则对该子进程进行资源回收处理,并且彻底销毁;若没有,则父进程一直停滞在此处。知道等到一个为止。
waitpid(),可以等待任意子进程提出,也可以等待指定子进程退出,同时支持阻塞等待子进程退出,也支持非阻塞等待子进程退出。使用非阻塞时,我们需要一直对子程序的状态进行监视,否则当该接口一次调用后便对后面子程序没有了作用。
- 使用signal函数,显示忽略SIGCHLD信号
当进程成为僵尸进程后,SIGCHLD会发送给它的父进程。在该模式下,子进程退出后子进程信息会被自动回收,不产生僵尸进程。