僵尸进程:
理解:一个进程已exit结束。但是父进程并没有结束,其父进程处于僵死状态为僵尸进程。
僵尸进程的危害
由于子进程的结束和父进程的运行是一个异步过程,即父进程永远无法预测子进程 到
底什么时候结束. 那么会不会因为父进程太忙来不及wait子进程,或者说不知道 子进程什
么时候结束,而丢失子进程结束时的状态信息呢? 不会。因为UNIX提供了一种机制可以保
证只要父进程想知道子进程结束时的状态信息, 就可以得到。这种机制就是: 在每个进
程退出的时候,内核释放该进程所有的资源,包括打开的文件,占用的内存等。 但是仍然为
其保留一定的信息(包括进程号the process ID,退出状态the termination status of the
process,运行时间the amount of CPU time taken by the process等)。直到父进程通过
wait / waitpid来取时才释放. 但这样就导致了问题,如果进程不调用wait / waitpid的话,
那么保留的那段信息就不会释放,其进程号就会一直被占用,但是系统所能使用的进程号是
有限的,如果大量的产生僵死进程,将因为没有可用的进程号而导致系统不能产生新的进程.
此即为僵尸进程的危害,应当避免。
僵尸进程的避免
1、父进程通过wait和waitpid等函数等待子进程结束,这会导致父进程挂起。
2. 如果父进程很忙,那么可以用signal函数为SIGCHLD安装handler,因为子进程结束后,
父进程会收到该信号,可以在handler中调用wait回收。
3. 如果父进程不关心子进程
什么时候结束,那么可以用signal(SIGCHLD, SIG_IGN) 通知内核,自己对子进程的结束
不感兴趣,那么子进程结束后,内核会回收, 并不再给父进程发送信号。
4. 还有一些技巧,就是fork两次,父进程fork一个子进程,然后继续工作,子进程fork
一 个孙进程后退出,那么孙进程被init接管,孙进程结束后,init会回收。不过子进程的回收
还要自己做。
怎样来清除僵尸进程
1.改写父进程,在子进程死后要为它收尸。
具体做法是接管SIGCHLD信号。子进程死后,会发送SIGCHLD信号给父进程,父进程收
到此信号后,执行waitpid()函数为子进程收尸。就是基于这样的原理:就算父进程没有调
本内容试读结束,登录后可阅读更多
下载后可阅读完整内容,剩余2页未读,立即下载