曲径通幽论坛

标题: 进程的退出 [打印本页]

作者: beyes    时间: 2009-6-15 15:29
标题: 进程的退出
进程的退出表示进程即将结束运行。在 linux 系统中进程退出的方法分为正常退出和异常退出两种。其中正常退出的方法有 3种,异常退出的方法有 2种。

(1)正常退出
(2)异常退出

不管是哪种方式退出,最终都会执行内核中同一段代码。这段代码用来关闭进程所有已打开的文件描述符,释放它所占用的内存和其他资源。

以下是各种退出方式的比较:
父子进程终止的先后顺序不同会产生不同的结果。在子进程退出前父进程退出,则系统会让 init 进程接管子进程。当子进程先于父进程终止,而父进程又没有调用 wait() 函数等待子进程结束,子进程进入僵死状态,并且会一直保持下去除非系统重启。子进程处于僵死状态时,内核只保存该进程的一些必要信息以备父进程所需。此时子进程始终占用着资源,同时也减少了系统可以创建的最大进程数。如果子进程先于父进程终止,且父进程调用了 wait() 或 waitpid() 函数,则父进程会等待子进程结束。
作者: beyes    时间: 2009-6-15 16:28
标题: exit 和 _exit() 的区别
( 1 ) exit() 和 _exit() 函数说明

exit 和 _exit 函数都是用来终止进程的。当程序执行到 exit 或 _exit 时,进程会无条件地停止剩下的所有操作,清除包括 PCB 在内的各种数据结构,并终止本进程的运行。但是,这两个函数还是有区别的,这两个函数的调用过程如下图所示:
 
作者: beyes    时间: 2009-6-15 17:47
标题: exit 和 _exit() 的区别-2
由上图可看出,_exit() 函数的作用是:直接使进程停止运行,清除其使用的内存空间,并清除其在内核中的各种数据结构;exit() 函数则在这些基础上做一些包装,在执行退出之前加了若干道工序。

exit() 函数和 _exit() 函数的最大区别在于 exit() 函数在调用 exit 系统之前要检查文件的打开情况,把文件缓冲区的内容写回文件,就是图中的 ”清理 I/O 缓冲“ 一项。

由于在 linux 的标准函数库中,有一种被称作“缓冲 I/O(buferred I/O)操作“,其特征就是对应每一个打开的文件,在内存中都有一片缓冲区。每次读文件时,会连续读出若干条记录,这样在下次读取文件时就可以直接从内存的缓冲区中读取。同样,每次写文件的时候,也仅仅是写入内存的缓冲区,等满了一定的条件( 如达到一定数量或遇到特定字符等 ),再将缓冲区中的内容一次性写入文件。

这种技术大大增加了文件读写的速度,但也为编程带来了一点麻烦。比如有一些数据,认为已经写入文件,实际上因为没有满足特定条件,它们还只是保存在缓冲区内,这时使用 _exit() 函数直接将进程关闭,缓冲区中的数据就会丢失。因此,若想保证数据的完整性,就一定要使用 exit() 函数。

关于 exit() 和 _exit() 的具体比较见:http://www.groad.net/bbs/read.php?tid=859




欢迎光临 曲径通幽论坛 (http://www.groad.net/bbs/) Powered by Discuz! X3.2