僵尸进程的避免
2012-04-27 15:12
435 查看
父进程未结束,子进程先结束,会产生僵尸进程。 子进程在调用exit命令结束自己的生命的时候,其实它并没有真正的被销毁,而是留下一个称为僵尸进程(Zombie)的数据结构(系统调用 exit,它的作用是使进程退出,但也仅仅限于将一个正常的进程变成一个僵尸进程,并不能将其完全销毁)。 即使是root身份kill -9也不能杀死僵尸进程。补救办法是杀死僵尸进程的父进程(僵尸进程的父进程必然存在),僵尸进程成为"孤儿进程",过继给1号进程init,init始终会负责清理僵尸进程。
僵尸进程的避免: (1) 父进程通过wait和waitpid等函数等待子进程结束,这会导致父进程挂起。 (2) 如果父进程很忙,那么可以用signal函数为SIGCHLD安装handler,因为子进程结束后, 父 进程会收到该信号,可以在handler中调用wait回收。 (3) 如果父进程不关心子进程什么时候结束,那么可以用signal(SIGCHLD, SIG_IGN) 通知内 核,自己对子进程的结束不感兴趣,那么子进程结束后,内核会回收, 并不再给父进程发送 信号。 (4) 还有一些技巧,就是fork两次,父进程fork一个子进程,然后继续工作,子进程fork一 个孙进 程后退出,那么孙进程被init接管,孙进程结束后, init会回收。不过子进程的回收 还要自己 做。
建议使用第三种方法,父进程直接忽略子进程的结束,留给内核作回收处理。这样就不 会产生僵尸进程。
相关文章推荐
- Linux进程实践(4) --wait避免僵尸进程
- linux下避免僵尸进程的几种方法
- 僵尸进程的产生与避免
- fork两次如何避免僵尸进程
- Linux进程实践(4) --wait避免僵尸进程
- 为何要fork()两次来避免产生僵尸进程?
- linux僵尸进程产生的原因以及如何避免产生僵尸进程(waitpid应对多进程的情况)
- Zombie僵尸进程发现,查找,追踪,杀死,避免
- fork两次如何避免僵尸进程http://blog.chinaunix.net/uid-20729605-id-1884370.html
- 【专题1】僵尸进程的产生和避免
- 避免僵尸进程的产生 & 一个有用的服务器模型
- fork两次如何避免僵尸进程
- 为什么要fork两次来避免产生僵尸进程
- 说说Linux中的信号处理和僵尸进程的避免
- Linux进程实践(4) --wait避免僵尸进程
- 为何要fork()两次来避免产生僵尸进程?
- 进程学习回顾---两次fork避免僵尸进程
- 避免僵尸进程的三种方法
- 为何要fork()两次来避免产生僵尸进程?
- 说说Linux中的信号处理和僵尸进程的避免