|
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
exit()和_exit()函数
2 t7 t8 D2 H( {
7 m$ s/ I1 p7 c5 @8 _& E4 n函数说明3 O h& B# I r
$ O- S/ x- d8 A: v
创建进程使用fork()函数,执行进程使用exec函数族,终止进程则使用exit()和_exit()函数。当进程执行到exit()或_exit()函数时,进程会无条件的停止剩下的所有操作,清除各种数据结构,并终止本进程的运行。但是,这两个函数还是有区别的,其调用过程如图1所示:
3 y9 ]6 u3 W; k8 ^/ X2 u; i" q5 y e O, Y' d5 G) n7 K! O6 `
9 y9 e& u( w ~0 A* `" I$ u
) D+ D4 U# @3 d1 v, _& z& V 从图1可以看出,_exit()函数的作用是:直接使进程停止运行,清除其使用的内存空间,并清除其在内核中的各种数据结构;而exit()函数则在这些基础上做了一些包装,在执行退出之前加了若干道工序。exit()函数和_exit()函数的最大区别就在于exit()函数在终止当前进程之前要检查该进程打开过哪些文件,把文件缓冲区中的内容写回文件,也就是图1中的“清理I/O缓冲”一项。$ d8 n. P2 B3 G+ Z- l5 E1 F
8 D' r& j* [8 ]; t
在Linux的标准函数库中,有一种被称作“缓冲I/O(buffered I/O)”的操作,其特征就是对应每一个打开的文件,在内存中都有一片缓冲区。
& g; L* y! C2 J8 y z8 R4 z3 n4 P2 g1 ~0 M# Q7 ?* Z
每次读文件时,会连续读出若干条记录,这样在下次读文件时就可以直接从内存的缓冲区中读取;同样,每次写文件时,也仅仅是写入内存中的缓冲区,等满足了一定的条件(如达到一定数量或遇到特定字符等,最典型的就是咱们的vim中使用的:w命令),再将缓冲区中的内容一次性写入文件。! R9 X' z# x' p, J5 ^8 o
# ?, P, O1 e8 E( R; i4 a: [( q
这种技术大大增加了文件读写的速度,但也给咱们的编程带来了一些麻烦。比如有些数据你认为已经被写入到文件中,实际上因为没有满足特定的条件,它们还只是被保存在缓冲区内,这时用_exit()函数直接将进程关闭掉,缓冲区中的数据就会丢失。因此,若想保证数据的完整性,最好使用exit()函数。0 e5 ?, D J, p) Q9 [- n* h/ v( v
6 Q' R! S7 ?: ~. \# I' R# @8 S
函数语法
0 `6 N* R( t1 T! u+ x" T% r+ L0 V& z, M7 ~4 j. B- Z s2 {
下表列出了exit()和_exit()函数的语法要点: I9 T8 g% m2 f
% D0 t- t* N8 b
9 h R! u: B, e7 f9 n
+ I5 u" b& V5 O% a |
|