$ x1 h; l( i) E* }1 z , @! X! i* r- C+ D. A' r- c 从图1可以看出,_exit()函数的作用是:直接使进程停止运行,清除其使用的内存空间,并清除其在内核中的各种数据结构;而exit()函数则在这些基础上做了一些包装,在执行退出之前加了若干道工序。exit()函数和_exit()函数的最大区别就在于exit()函数在终止当前进程之前要检查该进程打开过哪些文件,把文件缓冲区中的内容写回文件,也就是图1中的“清理I/O缓冲”一项。 $ n L' t9 {" y' u3 `1 a$ `( m . }+ \" {! V0 m9 \ 在Linux的标准函数库中,有一种被称作“缓冲I/O(buffered I/O)”的操作,其特征就是对应每一个打开的文件,在内存中都有一片缓冲区。5 a! |8 }! B! }* S
& b6 q% X! Z j1 k7 _# i$ k7 i6 m 每次读文件时,会连续读出若干条记录,这样在下次读文件时就可以直接从内存的缓冲区中读取;同样,每次写文件时,也仅仅是写入内存中的缓冲区,等满足了一定的条件(如达到一定数量或遇到特定字符等,最典型的就是咱们的vim中使用的:w命令),再将缓冲区中的内容一次性写入文件。+ F# H |. t4 J6 m
% s% V' F/ B/ E0 K- u+ R 这种技术大大增加了文件读写的速度,但也给咱们的编程带来了一些麻烦。比如有些数据你认为已经被写入到文件中,实际上因为没有满足特定的条件,它们还只是被保存在缓冲区内,这时用_exit()函数直接将进程关闭掉,缓冲区中的数据就会丢失。因此,若想保证数据的完整性,最好使用exit()函数。9 t* f' o) \4 U5 {7 h5 @* q
- d4 G6 N; c# d- j3 a- z: @! ] 函数语法; W# ^9 }/ |2 p) m! @% C2 g% l & N L# _& x! H n
下表列出了exit()和_exit()函数的语法要点: ' i% J4 W/ y' p _5 e6 F* |9 l P) O# k% \* o7 t' _( F# y