文件名称:exit函数-cadence入门教程
文件大小:5.91MB
文件格式:PDF
更新时间:2024-07-02 09:19:59
Unix linux 环境 编程
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