Linux 采用的是一个进程树结构,除了 init 进程(pid 1)之外,其他的进程都会有一个父进程,最上层的父进程则是 init。
假如一个进程(称之为父进程)创建了另一个进程(称为子进程),在父进程中调用 wait()
会等待子进程完成并获得子进程的返回码。如果父进程不调用 wait()
而且自身仍在运行,则子进程结束后会变成 僵尸进程(zombie);大量僵尸进程会导致系统资源,特别是进程表耗尽,使得无法创建新的进程。假如父进程在子进程结束前就退出了,那子进程会变成 孤儿进程(orphan),被 init 进程接管(即它的父进程变成 init 进程),init 进程会自动调用 wait()
来回收。假如子进程处于僵尸状态,但父进程还没调用 wait()
就退出了,子进程一样会被 init 进程接管。
假如一个进程有爷爷进程、也有父进程,如果父进程提前退出,爷爷进程还在,此时子进程仍然会被 init 接管。