僵尸进程
首先我们要明白什么是父子进程:初始启动一个程序,在程序内使用fork函数创建出一个新的进程。这个fork函数创建出来的进程就是初始进程的子进程。子进程和父进程的运行是分离的,但子进程在退出后会需要父进程调用wait函数或waitpid函数来做回收处理(回收这个表述不知道是否准确,不过确实方便理解)。而若父进程没有调用wait函数或waitpid函数获取子进程的状态信息,那么子进程的某些信息(如进程描述符)仍然保留在系统中,这种进程称为僵尸进程。其实,僵尸进程是每个子进程都会经历的一个状态,在自身退出而父进程还没来得及接收时。
僵尸进程会占用系统资源,比如说系统的进程id号。如果大量的僵尸进程占用系统id号,就会导致没有可用的进程id而不能产生新的进程。
init进程
引用百度百科上的介绍
init进程,它是内核启动的第一个用户级进程。init有许多很重要的任务,比如像启动getty(用于用户登录)、实现运行级别、以及处理孤立进程。
孤儿进程
上面已经提到了init进程的一个作用:处理孤儿进程。那么什么是孤儿进程呢?僵尸进程是没有被父进程程调用wait或waitpid回收的进程,但是如果子进程还没有结束或还没有被回收,父进程已经结束退出了,那么它就会变成孤儿进程。孤儿进程相比较于僵尸进程没有什么危害,因为它们会被init进程接收 (即父进程变为init进程,init进程的进程号是1),然后当它们结束时,也会由init进程完成状态收集。
总结来说,子进程结束后没有被父进程接收就会变成僵尸进程。若父进程退出,子进程(还没结束,或僵尸状态)就会变成孤儿进程,然后被init进程接收。