孤儿进程:一个父进程退出,而它的一个或多个子进程还在运行,那么这些子进程将成为孤儿进程,将被init
进程(进程号为1)所收养,并由init
进程对这些子进程完成状态收集工作;
僵尸进程:一个进程使用fork
创建子进程,如果子进程退出,而父进程并未调用wait
或waitpid
来获取子进程的状态信息,子进程的进程描述符仍然保存在系统中,那么这种子进程将成为僵尸进程。
僵尸进程的危害:在子进程退出的时候,内核释放该子进程所有的资源,但仍保留进程号、退出状态、运行时间等信息,直到父进程通过wait
或waitpid
对其进行释放;但如果父进程不对保留信息进行释放,进程号会一直被占用,然而系统所能使用的进程号是有限的,如果产生大量的僵尸进程,系统将因没有可用的进程号而导致系统不能产生新的进程。
解决僵尸进程的方法:
wait
和waitpid
等函数等待子进程结束,但这样会导致父进程挂起;signal
函数为SIGCHLD
安装handler
,这样当子进程结束后,父进程会收到信号,在handler
中调用wait
回收;signal(SIGCHLD, SIG_IGN)
通知内核,这样当子进程结束后,内核会对其进行回收;fork
两次,父进程fork
一个子进程后继续工作,子进程fork
一个孙进程后退出,那么孙进程将被init
接管,这样当子进程结束后,内核会对其进行回收。