来源:CSDN  作者:王文松   转自Linux公社

exit()和_exit()函数

函数说明

创建进程使用fork()函数,执行进程使用exec函数族,终止进程则使用exit()和_exit()函数。当进程执行到exit()或 _exit()函数时,进程会无条件的停止剩下的所有操作,清除各种数据结构,并终止本进程的运行。但是,这两个函数还是有区别的,其调用过程如图1所 示:

从图1可以看出,_exit()函数的作用是:直接使进程停止运行,清除其使用的内存空间,并清除其在内核中的各种数据结构;而exit()函数则在这些基础上做了一些包装,在执行退出之前加了若干道工序。exit()函数和_exit()函数的最大区别就在于exit()函数在终止当前进程之前要检查该进程打开过哪些文件,把文件缓冲区中的内容写回文件,也就是图1中的“清理I/O缓冲”一项。

在Linux的标准函数库中,有一种被称作“缓冲I/O(buffered I/O)”的操作,其特征就是对应每一个打开的文件,在内存中都有一片缓冲区。

每次读文件时,会连续读出若干条记录,这样在下次读文件时就可以直接从内存的缓冲区中读取;同样,每次写文件时,也仅仅是写入内存中的缓冲区,等满 足了一定的条件(如达到一定数量或遇到特定字符等,最典型的就是咱们的vim中使用的:w命令),再将缓冲区中的内容一次性写入文件。

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

函数语法

下表列出了exit()和_exit()函数的语法要点:

基础实验

以下两个基础实验1比较了exit()和_exit()函数的区别。由于 printf()函数使用的是缓冲I/O方式,该函数在遇到“\n”换行符时自动从缓冲区中将记录读出,以下两个基础实验就是利用这个性质来进行比较的。以下为实验1的代码:

执行结果如下图

从输出的结果可以看到,调用exit()函数时,缓冲区中的记录也能正常输出。

实验2的代码如下:

执行结果如下图:

从最后的结果可以看到,调用_exit()函数无法输出缓冲区中的记录。

如果在实验2中的代码中的 第二个代码加上回车符,那么结果会有不同了。自己试试哈!

最新文章

  1. middleware - bodyparser
  2. PHP基础示例:用PHP+Mysql编写简易新闻管理系统[转]
  3. Linq之Lambda表达式初步认识
  4. Emgu学习之(二)——图像读取、显示、保存
  5. 三种实例化bean的方式
  6. Drawing with GoogLeNet
  7. 2dx解析cocosbuilder中使用layer时的缺陷
  8. Angularjs 使用filter格式化输出href
  9. iTween基础之Move(移动)
  10. 【linux设备模型】之platform设备驱动
  11. Lucida Grande字体无法正常显示冒号的解决方案
  12. hdu 5606 tree(并查集)
  13. Let the Balloon Rise(map)
  14. react系列从零开始-react介绍
  15. 封装的应用【example_Array工具】
  16. Android Studio 错误 Duplicate files copied in APK META-INF/LICENSE.txt解决方案
  17. 关于Layer ui的加载层位置居中问题
  18. 第一个jQuery
  19. DELPHI XE10,JSON 生成和解析,再利用INDYHTTP控件POST
  20. 线程queue与进程queue

热门文章

  1. Spring:工厂模式哪里解耦了?
  2. Numpy中的广播机制,数组的广播机制(Broadcasting)
  3. Java 内存溢出(java.lang.OutOfMemoryError)的常见情况和处理方式
  4. 浅谈typeof 和instanceof
  5. 使用Jmeter如何测试下载接口
  6. Python数据可视化实战:实时更新海外疫情数据,实现数据可视化
  7. intellij配置github
  8. 虚拟机 VMware 设置VMWARE通过桥接方式使用主机无线网卡上网
  9. 02.Hamcrest和TestSuite介绍
  10. BERT的前世今生