Posted on 2013-05-14 17:32
hoshelly 阅读(466)
评论(0) 编辑 收藏 引用 所属分类:
Linux
在说明f o r k函数时,一定是一个父进程生成一个子进程。上面又说明了子进程将其终止状态返回给父进程。但是如果父进程在子进程之前终止,则将如何呢?其回答是对于其父进程已经终止的所有进程,它们的父进程都改变为i n i t进程。
我们称这些进程由i n i t进程领养。其操作过程大致是:在一个进程终止时,内核逐个检查所有活动进程,以判断它是否是正要终止的进程的子进程,如果是,则该进程的父进程I D就更改为1 ( i n i t进程的I D )。这种处理方法保证了每个进程有一个父进程。
如果子进程在父进程之前终止,那么父进程又如何能在做相应检查时得到子进程的终止状态呢?对此问题的回答是内核为每个终止子进程保存了一定量的信
息,所以当终止进程的父进程调用 w a i t或waitpid 时,可以得到有关信息。这种信息至少包括进程I D、该进程的终止状态、以反该进程使用的 C P U时间总量。内核可以释放终止进程所使用的所有存储器,关闭其所有打开文件。在 U N I X术语中,一个已经终止、但是其父进程尚未对其进行善后处理(获取终止子进程的有关信息、释放它仍占用的资源)的进程被称为僵死进程(z o m b i e)。p s ( 1 )命令将僵死进程的状态打印为 Z。
一个由i n i t进程领养的进程终止时会发生什么?它会不会变成一个僵死进程?对此问题的回答是“否”,因为i n i t被编写成只要有一个子进程终止, i n i t就会调用一个w a i t函数取得其终止状态。这样也就防止了在系统中有很多僵死进程。当提及“一个i n i t的子进程”时,这指的是i n i t直接产生的进程,或者是其父进程已终止,由init 领养的进程。