曲径通幽论坛
标题:
进程的退出
[打印本页]
作者:
beyes
时间:
2009-6-15 15:29
标题:
进程的退出
进程的退出表示进程即将结束运行。在 linux 系统中进程退出的方法分为正常退出和异常退出两种。其中正常退出的方法有 3种,异常退出的方法有 2种。
(1)正常退出
在 main() 函数中执行 return 。
调用 exit() 函数。
调用 _exit() 函数。
(2)异常退出
调用 abort() 函数。
进程收到某个信号,而该信号使进程终止。
不管是哪种方式退出,最终都会执行内核中同一段代码。这段代码用来关闭进程所有已打开的文件描述符,释放它所占用的内存和其他资源。
以下是各种退出方式的比较:
exit 和 return 的区别:exit 是一个函数,有参数;而 return 是函数执行完后的返回。exit 把控制权交给系统,而 return 将控制权交给调用函数。
exit 和 abort 的区别:exit 是正常终止进程,而 abort 是异常终止。
exit (int exit_code ) :exit 中的参数 exit_code 为 0 代表进程正常终止,若为其他值表示程序执行过程中有错误发生,比如溢出、除数为 0 。
exit 和 _exit() 的区别:exit() 在头文件 stdlib.h 中声明,而 _exit() 声明在头文件 unistd() 中。两个函数均能正常终止进程,但是 _exit() 会执行后立即返回给内核,而 exit() 要先执行一些清除操作,然后将控制权交给内核。
父子进程终止的先后顺序不同会产生不同的结果。在子进程退出前父进程退出,则系统会让 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