孤儿进程
父进程退出,它的子进程就会成为孤儿进程,所有的孤儿进程都会被init接管,释放它们占用的系统资源。孤儿进程没有实质性危害。
僵尸进程
进程通过fork创建子进程,如果子进程退出,父进程没有调用wait
、waitpid
等系统函数获取子进程的状态,那么子进程的描述符、进程号就会一直被占用,成为僵尸进程。
很明显,僵尸进程会占用系统资源,过多的僵尸进程会导致进程号耗尽,无法创建新进程。
相关机制:子进程退出后,系统会回收文件、内存等资源,但不会回收进程号,它要等到父进程调用
wait
后才会被释放。
解决方法
子进程退出后,发送SIGCHILD
信号,父进程在信号处理函数中调用wait
接受子进程的状态。或者可行的话,直接杀死父进程,使子进程成为孤儿进程,由init进程接管。
总结
父子进程好比是父子,init进程好比是社保局。
当父亲意外身亡时,儿子自动成为孤儿(孤儿进程),那么自然社保局(init进程)就会来安置这些孤儿。
而如果遇到不负责的父亲,对孩子不管不顾,那么社保局可以对这个父亲进行劝解,加强对孩子的关心(wait, waitpid),或者冥顽不灵的,直接处理(kill it)它的孩子由于成为孤儿而依法获得安置。
网友评论