-
\"Cadence入门教程中关于exit函数的介绍\
资源介绍
8.5 exit函数
如同7 . 3节所述,进程有三种正常终止法及两种异常终止法。
(1) 正常终止:
(a) 在m a i n函数内执行r e t u r n语句。如在7 . 3节中所述,这等效于调用e x i t。
(b) 调用e x i t函数。此函数由ANSI C定义,其操作包括调用各终止处理程序(终止处理程序
在调用a t e x i t函数时登录),然后关闭所有标准I / O流等。因为ANSI C并不处理文件描述符、
多进程(父、子进程)以及作业控制,所以这一定义对U N I X系统而言是不完整的。
(c) 调用_ e x i t系统调用函数。此函数由 e x i t调用,它处理U N I X特定的细节。 _ e x i t是由
P O S I X . 1说明的。
(2) 异常终止:
(a) 调用a b o r t。它产生S I G A B RT信号,所以是下一种异常终止的一种特例。
(b) 当进程接收到某个信号时。(第1 0章将较详细地说明信号。)进程本身(例如调用
a b o r t函数)、其他进程和内核都能产生传送到某一进程的信号。例如,进程越出其
地址空间访问存储单元,或者除以0,内核就会为该进程产生相应的信号。
不管进程如何终止,最后都会执行内核中的同一段代码。这段代码为相应进程关闭所有打
开描述符,释放它所使用的存储器等等。
对上述任意一种终止情形,我们都希望终止进程能够通知其父进程它是如何终止的。对
于e x i t和_ e x i t,这是依靠传递给它们的退出状态( exit status)参数来实现的。在异常终止情
况,内核(不是进程本身)产生一个指示其异常终止原因的终止状态( termination status)。
在任意一种情况下,该终止进程的父进程都能用 w a i t或w a i t p i d函数(在下一节说明 )取得其终止
状态。
注意,这里使用了“退出状态”(它是传向e x i t或_ e x i t的参数,或m a i n的返回值)和“终止
状态”两个术语,以表示有所区别。在最后调用 _ e x i t时内核将其退出状态转换成终止状态(回
忆图7 - 1)。下一节中的表 8 - 1说明了父进程检查子进程的终止状态的不同方法。如果子进程正
常终止,则父进程可以获得子进程的退出状态。
在说明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术语中,一个已经终止、但是其父进程尚未
对其进行善后处理(获取终止子进程的有关信息、释放它仍占用的资源)的进程被称为僵死
第 8章 进 程 控 制 1 4 7
- 上一篇: 进程标识-cadence入门教程
- 下一篇: 竞态条件-cadence入门教程