Tag Archives: 僵尸

异步回收fork出的子进程(僵尸进程)

fork()之后,子进程和父进程分叉执行,僵尸进程的产生是因为父进程没有给子进程“收尸”造成的,又可以根据危害程度分为下述两类:
总体来说:当子进程结束之后,但父进程未结束之前,子进程将成为僵尸进程。
(1)当子进程结束之后,但父进程未结束之前,子进程将成为僵尸进程,父进程结束后僵尸被init进程回收。
(2)如果子进程结束了,但是父进程始终没有结束,那么这个僵尸将一直存在,而且随着exec,僵尸越来越多。
传统的方法是在parent中使用wait()等待子进程直到回收,但是这样就会一直阻塞,父进程什么都作不了了!
有没有别的方法呢?有!那就是使用waitpid()+Signal的方法实现异步干掉僵尸进程。
原理:
(1)子进程退出的时候,会发送一个信号:SIGCHLD
(2)使用signal()可以指定程序处理某个信号量的对应handle函数
内附源代码。[......]

继续阅读