孤儿进程和僵尸进程与Linux的进程回收机制有关。在Linux中,使用系统调用exit函数族使进程结束运行。在用户程序中即使程序员没有写入调用exit的代码,系统也会在最后执行exit的系统调用。
在多进程环境下,子进程的结束状态应该让父进程知道,因为父进程可能会需要子进程的一些信息。程序都会有返回值,子进程的主函数会把返回值通过系统调用exit提交给内核(因此exit调用必须被提供返回值参数status)。但进程间的地址空间独立,即使是父子进程,它们之间也是相互独立不可互访的,进程间通信必须要经由内核(无论是管道、消息队列、共享内存还是socket)。子进程的返回值需要先交给内核,再由父进程向内核请求访问其返回值。
进程是独立的调度单元,每个进程都有自己的返回值,在Linux的实现中,其返回值会被内核写入调用exit的进程的PCB中。进程在调用exit时就标识进程的生命周期结束了,其占用的大部分资源会被内核回收,比如内存、页表等,但进程的PCB还不能被回收,因为这里面存放着进程的结束状态。父进程通过调用wait或waitpid来获取子进程的结束状态,然后内核才能回收子进程的PCB。也就是说,回收PCB的工作不是在子进程调用exit时,而是在父进程调用wait或waitpid后,内核受理系统调用期间。