僵尸进程与孤儿进程,以及如何避免僵尸进程
僵尸进程与孤儿进程这部分参考了: https://www.cnblogs.com/Anker/p/3271773.html linux提供一种机制使子进程在退出时候,父进程能够收集到子进程的结束状态信息(子进程pid,退出状态,运行时间等)。父进程需要调用 wait/waitpid来获取这些信息。父进程收集这些信息后这些信息才会释放。 linux下新进程的创建可以由fork来产生新的子进程。然后根据fork的返回值(小于0,等于0,大于0)判断是fork出错,子进程还是父进程。通常情况下,父进程需要在子进程任务结束退出后做“善后”,也就是一些资源清理工作。子进程退出时会把打开的文件句柄,内存占用,打开的资源进行释放,但是不会清理进程控制块PCB信息。 孤儿进程:父进程早于子进程退出时候子进程还在运行,子进程会成为孤儿进程。linux会对孤儿进程的处理,把孤儿进程的父进程设为1,也就是由init进程来托管。init进程负责子进程退出后的善后清理工作。 僵尸进程:子进程退出后留下的进程信息没有被收集,会导致占用的进程控制块PCB不被释放,形成僵尸进程。进程已经死去,但是进程资源没有被释放掉。 问题及危害 如果系统中存在大量的僵尸进程,他们的进程号就会一直被占用,但是系统所能使用的进程号是有限的,系统将因为没有可用的进程号而导致系统不能产生新的进程.。 怎么避免僵尸进程1. 调用signal(SIGCHLD,SIG_IGN)函数 当子进程快要结束,会向父进程发送一个SIGCHLD信号,我们可以根据这个信号来处理子进程的善后工作。2.两次fork(),再调用waitpid()函数两次在fork()之后,得到父进程、子进程、孙进程。这时候让子进程退出,并且只需要父进程调用wait/waitpid回收子进程的遗留信息。这样人为的创建孤儿进程,让init去收养孙进程即可。3.杀死父进程。? 如果僵尸进程的父进程还存在,找到这个父进程,kill掉它。这样就会变成2的情况,init会负责善后工作。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |