温习 父进程/僵尸进程/孤儿进程 的概念
在 Unix-like 的操作系统中,除了 process 0, 其它所有进程都是 fork 产生的。调用了 fork 的进程就是父进程,被新建的进程就是子进程。Process 0 是在启动的时候创建的,fork 出了 process 1,自己变成 swapper。Process 1 是系统中所有其它进程的祖先。
在 Linux 中,还有 Parent 和 Real Parent 这两种概念。Parent 是子进程死后接收 SIGCHLD 的进程,real parent 是在多线程环境中创建了子进程的那个线程。
僵尸进程:当进程退出,操作系统释放了大部分资源,但关于资源消耗和退出码这些数据仍然保留,因为父进程可能需要子进程是否成功运行以及系统资源消耗量这些信息。默认情况下,操作系统像父亲发送 SIGCHLD,然后父亲使用 wait 真正回收掉最后的信息,并将 PID 从系统表中移除。当然,如果父亲不作为,这些数据就会在系统 PID 表中越来越多:这种没被释放掉数据的进程叫做僵尸进程。所以我们在写派生子进程的程序时,需要防止僵尸进程出现:简单来说就是处理 SIGCHLD 信号,调用 wait 函数,直到没有这样的 pid 出现。
孤儿进程:父进程死,子进程还活着,这是操作系统会将子进程的 parent pid 重定义为 init process pid 1. 我们也可以说 init 领养了系统里所有的孤儿进程。
课后习题:子进程什么时候会被爷爷进程领养呢?