僵尸进程
-
概念:
一个父进程利用fork创建子进程,如果子进程退出,而父进程没有利用wait或者waitpid来获取子进程状态信息,那么子进程的状态描述符依然保存到系统中,从而占用进程号,而系统中的进程号是有限的,如果产生大量僵尸进程,可能导致系统无法产生新进程,应当避免。 -
避免措施:
- 父进程通过wait和waitpid等函数等待子进程结束,这会导致父进程被挂起
- 如果父进程很忙,那么可以用signal函数为SIGCHLD安装handler,因为子进程结束后,父进程会收到该信号,可以在handler中调用wait回收
- 如果父进程不关心子进程什么时候结束,那么可以用signal(SIGCHLD,SIG_IGN)通知内核,自己对子进程的结束不感兴趣,那么子进程结束后,内核会回收,并不再给父进程发送信号。
- fork两次,父进程fork一个子进程,然后继续工作,子进程fork一个孙进程后退出,那么孙进程被init接管,孙进程结束后,init会回收,不过子进程的回收还要自己做。
-
解决措施
kill僵尸进程的父进程,由init进程接管僵尸进程,init进程始终会负责清理僵尸进程
孤儿进程
- 一个父进程退出,而它的一个或几个子进程依然在运行,那么这些子进程会变成孤儿进程,孤儿进程将被init进程(进程号为1)所收养,原因是每个进程结束的时候,系统都会扫描当前系统中所运行的所有进程,看有没有哪个进程是刚刚结束的进程的子进程,如果是的话,就由init接管它,并由init进程对它们完成状态收集的工作。init进程会循环地wait()它的子进程,这样当一个孤儿进程结束其生命周期后,init进程就会处理它的善后工作,因此孤儿进程不会有什么危害。
网友评论