概念
僵死状态(Zombies)是一个比较特殊的状态。
当进程退出并且父进程没有读取到子进程退出的返回代码时就会产生僵尸进程。僵尸进程会以终止状态保持在进程表中,并且会一直在等待父进程读取退出状态代码。所以,只要子进程退出,父进程还在运行,但父进程没有读取子进程状态,子进程进入Z状态
产生原因
在子进程终止后到父进程调用wait()前的时间里,子进程被称为zombie;
a. 子进程结束后向父进程发出SIGCHLD信号,父进程默认忽略了它
b. 父进程没有调用wait()或waitpid()函数来等待子进程的结束
c. 网络原因有时会引起僵尸进程;
危害
- 占用系统资源
- 内存泄漏
如何防止僵尸进程
- 让僵尸进程成为孤儿进程,由init进程回收;(手动杀死父进程)
- signal(SIGCHLD, SIG_IGN); 忽略SIGCHLD信号,这是一个常用于提升并发服务器性能的技巧。因为并发服务器常常fork很多子进程,子进程终结之后需要服务器进程去wait清理资源。如果将此信号的处理方式设置为忽略,可让内核把僵尸进程转交给init进程去处理,省去了大量僵尸进用系统资源。
- 2) 调用fork()两次;
- 3) 捕捉SIGCHLD信号,并在信号处理函数中调用wait函数;
- https://blog.csdn.net/csdn_kou/article/details/81057339
wait()和waitpid()的参数解析
https://blog.csdn.net/csdn_kou/article/details/81091191